#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "IntrinsicI.h"
#include "VarargsI.h"
#include "StringDefs.h"
static String XtNxtGetTypedArg = "xtGetTypedArg";
void
XtVaGetSubresources(
Widget widget,
XtPointer base,
_Xconst char* name,
_Xconst char* class,
XtResourceList resources,
Cardinal num_resources,
...)
{
va_list var;
XtTypedArgList args;
Cardinal num_args;
int total_count, typed_count;
WIDGET_TO_APPCON(widget);
LOCK_APP(app);
va_start(var, num_resources);
_XtCountVaList(var, &total_count, &typed_count);
va_end(var);
va_start(var, num_resources);
_XtVaToTypedArgList(var, total_count, &args, &num_args);
_XtGetSubresources(widget, base, name, class, resources, num_resources,
NULL, 0, args, num_args);
if (num_args != 0) {
XtFree((XtPointer)args);
}
va_end(var);
UNLOCK_APP(app);
}
void
XtVaGetApplicationResources(Widget widget, XtPointer base, XtResourceList resources, Cardinal num_resources, ...)
{
va_list var;
XtTypedArgList args;
Cardinal num_args;
int total_count, typed_count;
WIDGET_TO_APPCON(widget);
LOCK_APP(app);
va_start(var,num_resources);
_XtCountVaList(var, &total_count, &typed_count);
va_end(var);
va_start(var,num_resources);
_XtVaToTypedArgList(var, total_count, &args, &num_args);
_XtGetApplicationResources(widget, base, resources, num_resources,
NULL, 0, args, num_args);
if (num_args != 0) {
XtFree((XtPointer)args);
}
va_end(var);
UNLOCK_APP(app);
}
static void
GetTypedArg(
Widget widget,
XtTypedArgList typed_arg,
XtResourceList resources,
Cardinal num_resources)
{
String from_type = NULL;
Cardinal from_size = 0;
XrmValue from_val, to_val;
register Cardinal i;
Arg arg;
XtPointer value;
for (i = 0; i < num_resources; i++) {
if (StringToName(typed_arg->name) == StringToName(resources[i].resource_name)) {
from_type = resources[i].resource_type;
from_size = resources[i].resource_size;
break;
}
}
if (i == num_resources) {
XtAppWarningMsg(XtWidgetToApplicationContext(widget),
"unknownType", XtNxtGetTypedArg, XtCXtToolkitError,
"Unable to find type of resource for conversion",
(String *)NULL, (Cardinal *)NULL);
return;
}
value = ALLOCATE_LOCAL(from_size);
if (value == NULL) _XtAllocError(NULL);
XtSetArg(arg, typed_arg->name, value);
XtGetValues(widget, &arg, 1);
from_val.size = from_size;
from_val.addr = (XPointer)value;
to_val.addr = (XPointer)typed_arg->value;
to_val.size = typed_arg->size;
if (!XtConvertAndStore(widget, from_type, &from_val,
typed_arg->type, &to_val)) {
if (to_val.size > (unsigned) typed_arg->size) {
String params[2];
Cardinal num_params = 2;
params[0] = typed_arg->type;
params[1] = XtName(widget);
XtAppWarningMsg(XtWidgetToApplicationContext(widget),
"insufficientSpace", XtNxtGetTypedArg, XtCXtToolkitError,
"Insufficient space for converted type '%s' in widget '%s'",
params, &num_params);
}
else {
String params[3];
Cardinal num_params = 3;
params[0] = from_type;
params[1] = typed_arg->type;
params[2] = XtName(widget);
XtAppWarningMsg(XtWidgetToApplicationContext(widget),
"conversionFailed", XtNxtGetTypedArg, XtCXtToolkitError,
"Type conversion (%s to %s) failed for widget '%s'",
params, &num_params);
}
}
DEALLOCATE_LOCAL(value);
}
static int
GetNestedArg(
Widget widget,
XtTypedArgList avlist,
ArgList args,
XtResourceList resources,
Cardinal num_resources)
{
int count = 0;
for (; avlist->name != NULL; avlist++) {
if (avlist->type != NULL) {
GetTypedArg(widget, avlist, resources, num_resources);
} else if(strcmp(avlist->name, XtVaNestedList) == 0) {
count += GetNestedArg(widget, (XtTypedArgList)avlist->value,
args, resources, num_resources);
} else {
(args+count)->name = avlist->name;
(args+count)->value = avlist->value;
++count;
}
}
return(count);
}
void
XtVaGetValues(Widget widget, ...)
{
va_list var;
String attr;
ArgList args;
XtTypedArg typed_arg;
XtResourceList resources = (XtResourceList)NULL;
Cardinal num_resources;
int count, total_count, typed_count;
WIDGET_TO_APPCON(widget);
LOCK_APP(app);
va_start(var,widget);
_XtCountVaList(var, &total_count, &typed_count);
if (total_count != typed_count) {
args = (ArgList)__XtMalloc((unsigned)((total_count - typed_count)
* sizeof(Arg)));
}
else args = NULL;
va_end(var);
va_start(var,widget);
for(attr = va_arg(var, String), count = 0 ; attr != NULL;
attr = va_arg(var, String)) {
if (strcmp(attr, XtVaTypedArg) == 0) {
typed_arg.name = va_arg(var, String);
typed_arg.type = va_arg(var, String);
typed_arg.value = va_arg(var, XtArgVal);
typed_arg.size = va_arg(var, int);
if (resources == NULL) {
XtGetResourceList(XtClass(widget), &resources,&num_resources);
}
GetTypedArg(widget, &typed_arg, resources, num_resources);
} else if (strcmp(attr, XtVaNestedList) == 0) {
if (resources == NULL) {
XtGetResourceList(XtClass(widget),&resources, &num_resources);
}
count += GetNestedArg(widget, va_arg(var, XtTypedArgList),
(args+count), resources, num_resources);
} else {
args[count].name = attr;
args[count].value = va_arg(var, XtArgVal);
count ++;
}
}
va_end(var);
if (resources != (XtResourceList)NULL) {
XtFree((XtPointer)resources);
}
if (total_count != typed_count) {
XtGetValues(widget, args, count);
XtFree((XtPointer)args);
}
UNLOCK_APP(app);
}
void
XtVaGetSubvalues(XtPointer base,XtResourceList resources, Cardinal num_resources, ...)
{
va_list var;
ArgList args;
Cardinal num_args;
int total_count, typed_count;
va_start(var,num_resources);
_XtCountVaList(var, &total_count, &typed_count);
if (typed_count != 0) {
XtWarning("XtVaTypedArg is an invalid argument to XtVaGetSubvalues()\n");
}
va_end(var);
va_start(var,num_resources);
_XtVaToArgList((Widget)NULL, var, total_count, &args, &num_args);
va_end(var);
XtGetSubvalues(base, resources, num_resources, args, num_args);
if (num_args != 0) {
XtFree((XtPointer)args);
}
}