


XmResolveAllPartOffsets(3X)			  XmResolveAllPartOffsets(3X)
OSF/Motif							    OSF/Motif



NAME
  XXmmRReessoollvveeAAllllP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eAAllllP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,
		      _c_o_n_s_t_r_a_i_n_t__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;;
       XXmmOOffffsseettPPttrr* _c_o_n_s_t_r_a_i_n_t__o_f_f_s_e_t;;

DESCRIPTION
  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 XXmmRReessoollvveeAAllllPPaarrt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 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:

    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.

       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 XXttOOffffsseett for the
       offset, the widget uses XXmmCCoonnssttrraaiinnttPPaarrttOOffffsseett 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 } };

    oo++  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	sub-
       class of	the Constraint class, instead of putting the widget con-
       straint record size in the class	record,	the widget puts	the widget
       constraint 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++  Define a	variable, of type XXmmOOffffsseettPPttrr, 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.

    oo++  In class	initialization,	the widget calls XXmmRReessoollvveeAAllllPPaarrttOOffffsseettss,
       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 initial-
	 ized) size field to the part size field.

	 ----
	 If the	widget is a subclass of	the Constraint class, adds the super-
	 class 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.

    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 and XXmmCCoonnssttrraaiinnttFFiieelldd macros
       help you	access these fields.  Because the XXmmPPaarrttOOffffsseett,	XXmmCCoonn--
       ssttrraaiinnttPPaarrttOOffffsseett, XXmmFFiieelldd, and XXmmCCoonnssttrraaiinnttF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)))
       For constraint field _m_a_x__w_i_d_t_h:
	    #define BarMaxWidth(w) \
	      XmConstraintField(w,constraint_offsets,Bar,max_width,Dimension)

  The parameters for XXmmRReessoollvveeAAllllP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

  _c_o_n_s_t_r_a_i_n_t__o_f_f_s_e_t
	    Returns the	constraint offset record

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




















































