#define XT_COMPOSITE
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "IntrinsicI.h"
#include "StringDefs.h"
static XtResource resources[] = {
{XtNchildren, XtCReadOnly, XtRWidgetList, sizeof(WidgetList),
XtOffsetOf(CompositeRec, composite.children), XtRImmediate, NULL},
{XtNnumChildren, XtCReadOnly, XtRCardinal, sizeof(Cardinal),
XtOffsetOf(CompositeRec, composite.num_children), XtRImmediate, 0},
{XtNinsertPosition, XtCInsertPosition, XtRFunction, sizeof(XtOrderProc),
XtOffsetOf(CompositeRec, composite.insert_position), XtRImmediate, NULL},
};
static void CompositeClassPartInitialize(WidgetClass);
static void CompositeInitialize(Widget, Widget, ArgList, Cardinal *);
static void CompositeInsertChild(Widget);
static void CompositeDeleteChild(Widget);
static void CompositeDestroy(Widget);
externaldef(compositeclassrec) CompositeClassRec compositeClassRec = {
{
&widgetClassRec,
"Composite",
sizeof(CompositeRec),
NULL,
CompositeClassPartInitialize,
FALSE,
CompositeInitialize,
NULL,
XtInheritRealize,
NULL,
0,
resources,
XtNumber(resources),
NULLQUARK,
FALSE,
TRUE,
FALSE,
FALSE,
CompositeDestroy,
NULL,
NULL,
NULL,
NULL,
XtInheritSetValuesAlmost,
NULL,
NULL,
XtVersion,
NULL,
NULL,
NULL,
NULL,
NULL
},
{
NULL,
NULL,
CompositeInsertChild,
CompositeDeleteChild,
NULL
}
};
externaldef(compositewidgetclass) WidgetClass compositeWidgetClass = (WidgetClass) &compositeClassRec;
static void InheritAllowsChangeManagedSet(
WidgetClass widget_class)
{
CompositeWidgetClass cc = (CompositeWidgetClass) widget_class;
CompositeClassExtension ext, super_ext, new_ext;
ext = (CompositeClassExtension)
XtGetClassExtension(widget_class,
XtOffsetOf(CompositeClassRec, composite_class.extension),
NULLQUARK, 1L, 0);
if (ext && ext->version == XtCompositeExtensionVersion)
return;
super_ext = (CompositeClassExtension)
XtGetClassExtension(cc->core_class.superclass,
XtOffsetOf(CompositeClassRec, composite_class.extension),
NULLQUARK, 1L, 0);
LOCK_PROCESS;
if (super_ext && super_ext->version == XtCompositeExtensionVersion &&
super_ext->record_size == sizeof(CompositeClassExtensionRec) &&
super_ext->allows_change_managed_set) {
new_ext = (CompositeClassExtension)
__XtCalloc(1, sizeof(CompositeClassExtensionRec));
new_ext->next_extension = cc->composite_class.extension;
new_ext->record_type = NULLQUARK;
new_ext->version = XtCompositeExtensionVersion;
new_ext->record_size = sizeof(CompositeClassExtensionRec);
new_ext->accepts_objects = (ext ? ext->accepts_objects : False);
new_ext->allows_change_managed_set = True;
cc->composite_class.extension = (XtPointer) new_ext;
}
UNLOCK_PROCESS;
}
static void CompositeClassPartInitialize(
WidgetClass widgetClass)
{
register CompositePartPtr wcPtr;
register CompositePartPtr superPtr = NULL;
wcPtr = (CompositePartPtr)
&(((CompositeWidgetClass)widgetClass)->composite_class);
if (widgetClass != compositeWidgetClass)
superPtr = (CompositePartPtr)&(((CompositeWidgetClass)widgetClass
->core_class.superclass)->composite_class);
LOCK_PROCESS;
if (wcPtr->geometry_manager == XtInheritGeometryManager) {
wcPtr->geometry_manager =
superPtr->geometry_manager;
}
if (wcPtr->change_managed == XtInheritChangeManaged) {
wcPtr->change_managed =
superPtr->change_managed;
InheritAllowsChangeManagedSet(widgetClass);
}
if (wcPtr->insert_child == XtInheritInsertChild) {
wcPtr->insert_child = superPtr->insert_child;
}
if (wcPtr->delete_child == XtInheritDeleteChild) {
wcPtr->delete_child = superPtr->delete_child;
}
UNLOCK_PROCESS;
}
static void CompositeDestroy(
Widget w)
{
register CompositeWidget cw = (CompositeWidget) w;
XtFree((char *) cw->composite.children);
}
static void CompositeInsertChild(
Widget w)
{
register Cardinal position;
register Cardinal i;
register CompositeWidget cw;
register WidgetList children;
cw = (CompositeWidget) w->core.parent;
children = cw->composite.children;
if (cw->composite.insert_position != NULL)
position = (*(cw->composite.insert_position))(w);
else
position = cw->composite.num_children;
if (cw->composite.num_children == cw->composite.num_slots) {
cw->composite.num_slots += (cw->composite.num_slots / 2) + 2;
cw->composite.children = children =
(WidgetList) XtRealloc((XtPointer) children,
(unsigned) (cw->composite.num_slots) * sizeof(Widget));
}
for (i = cw->composite.num_children; i > position; i--) {
children[i] = children[i-1];
}
children[position] = w;
cw->composite.num_children++;
}
static void CompositeDeleteChild(
Widget w)
{
register Cardinal position;
register Cardinal i;
register CompositeWidget cw;
cw = (CompositeWidget) w->core.parent;
for (position = 0; position < cw->composite.num_children; position++) {
if (cw->composite.children[position] == w) {
break;
}
}
if (position == cw->composite.num_children) return;
cw->composite.num_children--;
for (i = position; i < cw->composite.num_children; i++) {
cw->composite.children[i] = cw->composite.children[i+1];
}
}
static void CompositeInitialize(
Widget requested_widget,
Widget new_widget,
ArgList args,
Cardinal *num_args)
{
register CompositeWidget cw;
cw = (CompositeWidget) new_widget;
cw->composite.num_children = 0;
cw->composite.children = NULL;
cw->composite.num_slots = 0;
}