


XmResolvePartOffsets(3X)			     XmResolvePartOffsets(3X)
OSF/Motif							    OSF/Motif



NAME
  XXmmRReessoollvveePPaarrttOOffffsseettss - A function that allows	writing	of upward-compatible
  applications and widgets

SYNOPSIS


  ##iinncclluuddee <<XXmm//XXmmPP..hh>>
  vvooiidd XXmmRReessoollvveePPaarrttOOffffsseettss ((_w_i_d_g_e_t__c_l_a_s_s, _o_f_f_s_e_t))
       WWiiddggeettCCllaassss_w_i_d_g_e_t__c_l_a_s_s;;
       XXmmOOffffsseettPPttrr* _o_f_f_s_e_t;;

DESCRIPTION
  The use of offset records requires one extra global variable per widget
  class.  The variable consists	of a pointer to	an array of offsets into the
  widget record	for each part of the widget structure.	The XXmmRReessoollvveePPaarr--
  ttOOffffsseettss function allocates the offset records needed	by an application to
  guarantee upward-compatible access to	widget instance	records	by applica-
  tions	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:

    oo++  Instead of creating a resource list, the	widget creates an offset
       resource	list.  To help you accomplish this, use	the XXmmPPaarrttRReessoouurrccee
       structure and the XXmmPPaarrttOOffffsseett macro.  The XXmmPPaarrttRReessoouurrccee data struc-
       ture 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
       XXttOOffffsseett	for the	offset,	the widget uses	XXmmPPaarrttOOffffsseett.
	    XmPartResource resources[] = {
	      {	BarNxyz, BarCXyz, XmRBoolean,
		sizeof(Boolean), XmPartOffset(Bar,xyz),
		XmRImmediate, (XtPointer)False }
	    };

    oo++  Instead of putting the widget size in the class record, the widget
       puts the	widget part size in the	same field.

    oo++  Instead of putting XXttVVeerrssiioonn in the class record, the widget puts
       XXttVVeerrssiioonnDDoonnttCChheecckk in the class record.

    oo++  The widget defines a variable, of type XXmmOOffffsseettPPttrr, to point to the
       offset record.  This can	be part	of the widget's	class record or	a
       separate	global variable.

    oo++  In class	initialization,	the widget calls XXmmRReessoollvveePPaarrttOOffffsseettss, pass-
       ing it a	pointer	to contain the address of the offset record and	the
       class record.  This does	several	things:

	 ----
	 Adds the superclass (which, by	definition, has	already	been initial-
	 ized) size field to the part size field.

	 ----
	 Allocates an array based upon the number of superclasses.

	 ----
	 Fills in the offsets of all the widget	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.

    oo++  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 XXmmPP..hh.
	    #define BarIndex (XmBulletinBIndex + 1)

    oo++  Instead of accessing fields directly, the widget	must always go
       through the offset table.  The XXmmFFiieelldd macro helps you access these
       fields.	Because	the XXmmPPaarrttOOffffsseett and XXmmFFiieelldd 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) argu-
       ment, as	illustrated here:
	    XmField(w, offset, Label, text, char *)
       You can define macros for each field to make this easier.  Assume an
       integer field _x_y_z:
	    #define BarXyz(w) (*(int *)(((char *) w) + \
	      offset[BarIndex] + XtOffset(BarPart,xyz)))

  The parameters for XXmmRReessoollvveePPaarrttOOffffsseettss are defined below:

  _w_i_d_g_e_t__c_l_a_s_s
	    Specifies the widget class pointer for the created widget.

  _o_f_f_s_e_t    Returns the	offset record.

RELATED	INFORMATION
  XXmmRReessoollvveeAAllllPPaarrttOOffffsseettss((33XX)).





























