Blob Blame History Raw
'\" t
...\" ResolveA.sgm /main/10 1996/09/25 10:05:27 cdedoc $
.de P!
.fl
\!!1 setgray
.fl
\\&.\"
.fl
\!!0 setgray
.fl			\" force out current output buffer
\!!save /psv exch def currentpoint translate 0 0 moveto
\!!/showpage{}def
.fl			\" prolog
.sy sed -e 's/^/!/' \\$1\" bring in postscript file
\!!psv restore
.
.de pF
.ie     \\*(f1 .ds f1 \\n(.f
.el .ie \\*(f2 .ds f2 \\n(.f
.el .ie \\*(f3 .ds f3 \\n(.f
.el .ie \\*(f4 .ds f4 \\n(.f
.el .tm ? font overflow
.ft \\$1
..
.de fP
.ie     !\\*(f4 \{\
.	ft \\*(f4
.	ds f4\"
'	br \}
.el .ie !\\*(f3 \{\
.	ft \\*(f3
.	ds f3\"
'	br \}
.el .ie !\\*(f2 \{\
.	ft \\*(f2
.	ds f2\"
'	br \}
.el .ie !\\*(f1 \{\
.	ft \\*(f1
.	ds f1\"
'	br \}
.el .tm ? font underflow
..
.ds f1\"
.ds f2\"
.ds f3\"
.ds f4\"
.ta 8n 16n 24n 32n 40n 48n 56n 64n 72n 
.TH "XmResolveAllPartOffsets" "library call"
.SH "NAME"
\fBXmResolveAllPartOffsets\fP \(em A function that allows writing of upward-compatible applications and widgets
.iX "XmResolveAllPartOffsets"
.SH "SYNOPSIS"
.PP
.nf
#include <Xm/Xm\&.h>
\fBvoid \fBXmResolveAllPartOffsets\fP\fR(
\fBWidgetClass \fBwidget_class\fR\fR,
\fBXmOffsetPtr \fB* offset\fR\fR,
\fBXmOffsetPtr \fB* constraint_offset\fR\fR);
.fi
.SH "DESCRIPTION"
.PP
.RS
\fBNote:  
.PP
This routine is obsolete and exists for compatibility with previous
releases\&. You should call \fBXmeResolvePartOffsets\fP instead\&.
.RE
.PP
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 \fBXmResolveAllPartOffsets\fP 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 steps described in the following paragraphs\&.
.PP
Instead of creating a resource list, the widget creates an offset
resource list\&.
To accomplish this, use the \fBXmPartResource\fR
structure and the \fBXmPartOffset\fP macro\&.
The \fBXmPartResource\fR data structure looks just like a
resource list, but instead of having
one integer for its offset, it has two shorts\&.
This structure is put into the class record as if it were a normal resource
list\&. Instead of using \fBXtOffset\fP for the offset, the widget uses
\fBXmPartOffset\fP\&.
.PP
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 \fBXtOffset\fP for the offset,
the widget uses \fBXmConstraintPartOffset\fP in the constraint resource
list\&.
.PP
.nf
\f(CWXmPartResource 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 } };\fR
.fi
.PP
.PP
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\&.
.PP
Instead of putting \fBXtVersion\fP in the class record, the widget puts
\fBXtVersionDontCheck\fP in the class record\&.
.PP
Define a variable, of type \fBXmOffsetPtr\fR, to point to
the offset record\&.
If the widget is a subclass of the Constraint class, define a variable
of type \fBXmOffsetPtr\fR to point to the constraint offset record\&.
These can be part of the widget\&'s class record or separate global
variables\&.
.PP
In class initialization, the widget calls \fBXmResolveAllPartOffsets\fP,
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:
.IP "   \(bu" 6
Adds the superclass (which, by definition, has already been initialized)
size field to the part size field
.IP "   \(bu" 6
If the widget is a subclass of the Constraint class, adds the superclass
constraint size field to the constraint size field
.IP "   \(bu" 6
Allocates an array based upon the number of superclasses
.IP "   \(bu" 6
If the widget is a subclass of the constraint class, allocates an array
for the constraint offset record
.IP "   \(bu" 6
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
.IP "   \(bu" 6
Uses the part offset array to modify the offset entries in the resource
list to be real offsets, in place
.PP
The widget defines a constant that 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 \fBXm\fP
widgets can be found in \fBXmP\&.h\fP\&.
.PP
.nf
\f(CW#define BarIndex (XmBulletinBIndex + 1)\fR
.fi
.PP
.PP
Instead of accessing fields directly, the widget must always go through
the offset table\&.
The \fBXmField\fP and \fBXmConstraintField\fP macros help you access
these fields\&.
Because the \fBXmPartOffset\fP, \fBXmConstraintPartOffset\fP,
\fBXmField\fP, and \fBXmConstraintField\fP
macros concatenate things, 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:
.PP
.nf
\f(CWXmField(w, offset, Label, text, char *)
XmPartOffset(Label, text)\&.\fR
.fi
.PP
.PP
Therefore, you must not have any spaces after the part (Label)
argument, as illustrated here:
.PP
.nf
\f(CWXmField(w, offset, Label, text, char *)\fR
.fi
.PP
.PP
You can define macros for each field to make this easier\&.
Assume an integer field \fIxyz\fP:
.PP
.nf
\f(CW#define BarXyz(w) (*(int *)(((char *) w) + \e
        offset[BarIndex] + XtOffset(BarPart,xyz)))\fR
.fi
.PP
.PP
For constraint field \fImax_width\fP:
.PP
.nf
\f(CW#define BarMaxWidth(w) \e
        XmConstraintField(w,constraint_offsets,Bar,max_width,Dimension)\fR
.fi
.PP
.PP
The parameters for \fBXmResolveAllPartOffsets\fP are
.IP "\fIwidget_class\fP" 10
Specifies the widget class pointer for the created widget
.IP "\fIoffset\fP" 10
Returns the offset record
.IP "\fIconstraint_offset\fP" 10
Returns the constraint offset record
.SH "RELATED INFORMATION"
.PP
\fBXmResolvePartOffsets\fP(3)\&.
...\" created by instant / docbook-to-man, Sun 22 Dec 1996, 20:29