#define OBJECT
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "IntrinsicI.h"
#include "StringDefs.h"
static XtResource resources[] = {
{XtNdestroyCallback, XtCCallback, XtRCallback,sizeof(XtPointer),
XtOffsetOf(ObjectRec,object.destroy_callbacks),
XtRCallback, (XtPointer)NULL}
};
static void ObjectClassPartInitialize(WidgetClass);
static Boolean ObjectSetValues(Widget, Widget, Widget, ArgList, Cardinal *);
static void ObjectDestroy(Widget);
externaldef(objectclassrec) ObjectClassRec objectClassRec = {
{
NULL,
"Object",
sizeof(ObjectRec),
NULL,
ObjectClassPartInitialize,
FALSE,
NULL,
NULL,
NULL,
NULL,
0,
resources,
XtNumber(resources),
NULLQUARK,
FALSE,
FALSE,
FALSE,
FALSE,
ObjectDestroy,
NULL,
NULL,
ObjectSetValues,
NULL,
NULL,
NULL,
NULL,
XtVersion,
NULL,
NULL,
NULL,
NULL,
NULL
}
};
externaldef(objectClass) WidgetClass objectClass
= (WidgetClass)&objectClassRec;
static void ConstructCallbackOffsets(
WidgetClass widgetClass)
{
static XrmQuark QCallback = NULLQUARK;
register int i;
register int tableSize;
register CallbackTable newTable;
register CallbackTable superTable;
register XrmResourceList resourceList;
ObjectClass objectClass = (ObjectClass)widgetClass;
if (QCallback == NULLQUARK)
QCallback = XrmPermStringToQuark(XtRCallback);
if (objectClass->object_class.superclass != NULL) {
superTable = (CallbackTable)
((ObjectClass) objectClass->object_class.superclass)->
object_class.callback_private;
tableSize = (int)(long) superTable[0];
} else {
superTable = (CallbackTable) NULL;
tableSize = 0;
}
resourceList = (XrmResourceList) objectClass->object_class.resources;
for (i = objectClass->object_class.num_resources; --i >= 0; resourceList++)
if (resourceList->xrm_type == QCallback)
tableSize++;
newTable = (CallbackTable)
__XtMalloc(sizeof(XrmResource *) * (tableSize + 1));
newTable[0] = (XrmResource *)(long) tableSize;
if (superTable)
tableSize -= (int)(long) superTable[0];
resourceList = (XrmResourceList) objectClass->object_class.resources;
for (i=1; tableSize > 0; resourceList++)
if (resourceList->xrm_type == QCallback) {
newTable[i++] = resourceList;
tableSize--;
}
if (superTable)
for (tableSize = (int)(long) *superTable++;
--tableSize >= 0; superTable++)
newTable[i++] = *superTable;
objectClass->object_class.callback_private = (XtPointer) newTable;
}
static void InheritObjectExtensionMethods(
WidgetClass widget_class)
{
ObjectClass oc = (ObjectClass) widget_class;
ObjectClassExtension ext, super_ext = NULL;
ext = (ObjectClassExtension)
XtGetClassExtension(widget_class,
XtOffsetOf(ObjectClassRec, object_class.extension),
NULLQUARK, XtObjectExtensionVersion,
sizeof(ObjectClassExtensionRec));
if (oc->object_class.superclass)
super_ext = (ObjectClassExtension)
XtGetClassExtension(oc->object_class.superclass,
XtOffsetOf(ObjectClassRec, object_class.extension),
NULLQUARK, XtObjectExtensionVersion,
sizeof(ObjectClassExtensionRec));
LOCK_PROCESS;
if (ext) {
if (ext->allocate == XtInheritAllocate)
ext->allocate = (super_ext ? super_ext->allocate : NULL);
if (ext->deallocate == XtInheritDeallocate)
ext->deallocate = (super_ext ? super_ext->deallocate : NULL);
} else if (super_ext) {
ext = (ObjectClassExtension)
__XtCalloc(1, sizeof(ObjectClassExtensionRec));
ext->next_extension = oc->object_class.extension;
ext->record_type = NULLQUARK;
ext->version = XtObjectExtensionVersion;
ext->record_size = sizeof(ObjectClassExtensionRec);
ext->allocate = super_ext->allocate;
ext->deallocate = super_ext->deallocate;
oc->object_class.extension = (XtPointer) ext;
}
UNLOCK_PROCESS;
}
static void ObjectClassPartInitialize(
register WidgetClass wc)
{
ObjectClass oc = (ObjectClass)wc;
oc->object_class.xrm_class =
XrmPermStringToQuark(oc->object_class.class_name);
if (oc->object_class.resources)
_XtCompileResourceList(oc->object_class.resources,
oc->object_class.num_resources);
ConstructCallbackOffsets(wc);
_XtResourceDependencies(wc);
InheritObjectExtensionMethods(wc);
}
static Boolean ObjectSetValues(
Widget old,
Widget request,
Widget widget,
ArgList args,
Cardinal * num_args)
{
register CallbackTable offsets;
register int i;
register InternalCallbackList *ol, *nl;
LOCK_PROCESS;
offsets = (CallbackTable) XtClass(widget)->core_class.callback_private;
for (i= (int)(long) *(offsets++); --i >= 0; offsets++) {
ol = (InternalCallbackList *)
((char *) old - (*offsets)->xrm_offset - 1);
nl = (InternalCallbackList *)
((char *) widget - (*offsets)->xrm_offset - 1);
if (*ol != *nl) {
if (*ol != NULL)
XtFree((char *) *ol);
if (*nl != NULL)
*nl = _XtCompileCallbackList((XtCallbackList) *nl);
}
}
UNLOCK_PROCESS;
return False;
}
static void ObjectDestroy (
register Widget widget)
{
register CallbackTable offsets;
register int i;
register InternalCallbackList cl;
LOCK_PROCESS;
offsets = (CallbackTable)
widget->core.widget_class->core_class.callback_private;
for (i = (int)(long) *(offsets++); --i >= 0; offsets++) {
cl = *(InternalCallbackList *)
((char *) widget - (*offsets)->xrm_offset - 1);
if (cl) XtFree((char *) cl);
}
UNLOCK_PROCESS;
}