|
XmResolveAllPartOffsets(3X)
Contents
|
XmResolveAllPartOffsets - A function that allows writing
of upward-compatible applications and widgets
#include <Xm/XmP.h>
void XmResolveAllPartOffsets (widget_class, offset, constraint_offset)
WidgetClass widget_class;
XmOffsetPtr * offset;
XmOffsetPtr * constraint_offset;
The use of offset records requires two extra global variables
per widget class. The variables consist of pointers
to arrays of offsets into the widget record and constraint
record for each part of the widget structure. The XmResolveAllPartOffsets
function allocates the offset records
needed by an application to guarantee upward-compatible
access to widget instance and constraint records by applications
and widgets. These offset records are used by the
widget to access all of the widget's variables. A widget
needs to take the following steps: Instead of creating a
resource list, the widget creates an offset resource list.
To help you accomplish this, use the XmPartResource structure
and the XmPartOffset macro. The XmPartResource data
structure looks just like a resource list, but instead of
having one integer for its offset, it has two shorts. This
is put into the class record as if it were a normal
resource list. Instead of using XtOffset for the offset,
the widget uses XmPartOffset.
If the widget is a subclass of the Constraint class
and it defines additional constraint resources,
create an offset resource list for the constraint
part as well. Instead of using XtOffset for the
offset, the widget uses XmConstraintPartOffset in
the constraint resource list.
XmPartResource resources[] = {
{ BarNxyz, BarCXyz, XmRBoolean, sizeof(Boolean),
XmPartOffset(Bar,xyz), XmRImmediate,
(XtPointer)False } };
XmPartResource constraints[] = {
{ BarNmaxWidth, BarNMaxWidth,
XmRDimension, sizeof(Dimension),
XmConstraintPartOffset(Bar,max_width),
XmRImmediate, (XtPointer)100 } }; Instead
of putting the widget size in the class record, the
widget puts the widget part size in the same field.
If the widget is a subclass of the Constraint
class, instead of putting the widget constraint
record size in the class record, the widget puts
the widget constraint part size in the same field.
Instead of putting XtVersion in the class record,
the widget puts XtVersionDontCheck in the class
record. Define a variable, of type XmOffsetPtr, to
point to the offset record. If the widget is a subclass
of the Constraint class, define a variable of
type XmOffsetPtr to point to the constraint offset
record. These can be part of the widget's class
record or separate global variables. In class initialization,
the widget calls XmResolveAllPartOffsets,
passing it pointers to the class record, the
address of the offset record, and the address of
the constraint offset record. If the widget not is
a subclass of the Constraint class, it should pass
NULL as the address of the constraint offset
record. This does several things: Adds the superclass
(which, by definition, has already been initialized)
size field to the part size field. If
the widget is a subclass of the Constraint class,
adds the superclass constraint size field to the
constraint size field. Allocates an array based
upon the number of superclasses. If the widget is
a subclass of the constraint class, allocates an
array for the constraint offset record. Fills in
the offsets of all the widget parts and constraint
parts with the appropriate values, determined by
examining the size fields of all superclass
records. Uses the part offset array to modify the
offset entries in the resource list to be real offsets.
The widget defines a constant which will be
the index to its part structure in the offsets
array. The value should be 1 greater than the index
of the widget's superclass. Constants defined for
all Xm widgets can be found in <XmP.h>.
#define BarIndex (XmBulletinBIndex + 1) Instead of
accessing fields directly, the widget must always
go through the offset table. The XmField and XmConstraintField
macros help you access these fields.
Because the XmPartOffset, XmConstraintPartOffset,
XmField, and XmConstraintField macros concatenate
things together, you must ensure that there is no
space after the part argument. For example, the
following macros do not work because of the space
after the part (Label) argument:
XmField(w, offset, Label , text, char *) XmPartOffset(Label
, text).
Therefore, you must not have any spaces after the
part (Label) argument, as illustrated here:
XmField(w, offset, Label, text, char *)
You can define macros for each field to make this
easier. Assume an integer field xyz:
#define BarXyz(w) (*(int *)(((char *) w) + \
offset[BarIndex] + XtOffset(BarPart,xyz)))
For constraint field max_width:
#define BarMaxWidth(w) \
XmConstraintField(w,constraint_offsets,Bar,max_width,Dimension)
The parameters for XmResolveAllPartOffsets are defined
below: Specifies the widget class pointer for the created
widget Returns the offset record Returns the constraint
offset record
XmResolvePartOffsets(3X)
XmResolveAllPartOffsets(3X)
[ Back ] |