Blame lib/Xm/Resolve.c

Packit b099d7
/* $TOG: Resolve.c /main/7 1997/07/14 14:35:00 csn $ */
Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include "XmI.h"
Packit b099d7
#include <Xm/PrimitiveP.h>
Packit b099d7
#include <Xm/ManagerP.h>
Packit b099d7
#include <Xm/GadgetP.h>
Packit b099d7
#include <Xm/BaseClassP.h> /* for _XmIsSubclassOf */
Packit b099d7
Packit b099d7
#define _ALIGN(size) (((size) + (sizeof(long)-1)) & ~(sizeof(long)-1))
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
Packit b099d7
static void ResolveSyntheticOffsets(
Packit b099d7
			WidgetClass wc, 
Packit b099d7
			XmOffsetPtr * ipot, 
Packit b099d7
			XmOffsetPtr * cpot) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *   XmeResolvePartOffsets
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
 
Packit b099d7
#define IsConstraintClass(wc) _XmIsSubclassOf(wc, constraintWidgetClass)
Packit b099d7
/*
Packit b099d7
 *  end FIX for 5178.
Packit b099d7
 */
Packit b099d7
Packit b099d7
static void
Packit b099d7
ResolveSyntheticOffsets(
Packit b099d7
			WidgetClass wc, 
Packit b099d7
			XmOffsetPtr * ipot, 
Packit b099d7
			XmOffsetPtr * cpot)
Packit b099d7
{
Packit b099d7
    XmSyntheticResource* sr = NULL;
Packit b099d7
    Cardinal nsr = 0;     /* normal resources */
Packit b099d7
    XmSyntheticResource* scr = NULL;
Packit b099d7
    Cardinal nscr = 0;    /* constraint resources */
Packit b099d7
    Cardinal i;
Packit b099d7
Packit b099d7
    /* Get synthetic resource and synthetic constraint resource lists */
Packit b099d7
Packit b099d7
    if (_XmIsSubclassOf(wc, xmPrimitiveWidgetClass)) {
Packit b099d7
        XmPrimitiveWidgetClass pwc = (XmPrimitiveWidgetClass)wc;
Packit b099d7
Packit b099d7
        sr = pwc->primitive_class.syn_resources;
Packit b099d7
        nsr = pwc->primitive_class.num_syn_resources;
Packit b099d7
    }
Packit b099d7
    else if (_XmIsSubclassOf(wc, xmManagerWidgetClass)) {
Packit b099d7
        XmManagerWidgetClass mwc = (XmManagerWidgetClass)wc;
Packit b099d7
Packit b099d7
        sr = mwc->manager_class.syn_resources;
Packit b099d7
        nsr = mwc->manager_class.num_syn_resources;
Packit b099d7
        scr = mwc->manager_class.syn_constraint_resources;
Packit b099d7
        nscr = mwc->manager_class.num_syn_constraint_resources;
Packit b099d7
    }
Packit b099d7
    else if (_XmIsSubclassOf(wc, xmGadgetClass)) {
Packit b099d7
        XmGadgetClass gwc = (XmGadgetClass)wc;
Packit b099d7
Packit b099d7
        sr = gwc->gadget_class.syn_resources;
Packit b099d7
        nsr = gwc->gadget_class.num_syn_resources;
Packit b099d7
    } else {
Packit b099d7
	return;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    /* Patch resource offsets using part offset tables */
Packit b099d7
Packit b099d7
    if (sr && nsr > 0 && ipot) {
Packit b099d7
        for (i = 0; i < nsr; i++)
Packit b099d7
            sr[i].resource_offset = XmGetPartOffset(&(sr[i]),ipot);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (scr && nscr > 0 && cpot) {
Packit b099d7
        for (i = 0; i < nscr; i++)
Packit b099d7
            scr[i].resource_offset = XmGetPartOffset(&(scr[i]),cpot);
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
void 
Packit b099d7
XmeResolvePartOffsets(
Packit b099d7
        WidgetClass w_class,
Packit b099d7
        XmOffsetPtr *offset,
Packit b099d7
        XmOffsetPtr *constraint_offset )
Packit b099d7
{
Packit b099d7
   WidgetClass c, super;
Packit b099d7
   ConstraintWidgetClass cc = NULL, scc = NULL;
Packit b099d7
   int i, classcount = 0;
Packit b099d7
   XmPartResource *pr;
Packit b099d7
Packit b099d7
   _XmProcessLock();
Packit b099d7
   super = w_class->core_class.superclass;
Packit b099d7
   /*
Packit b099d7
    *  Set up constraint class pointers
Packit b099d7
    */
Packit b099d7
   if (IsConstraintClass(super))
Packit b099d7
   {
Packit b099d7
        cc = (ConstraintWidgetClass)w_class;
Packit b099d7
	scc = (ConstraintWidgetClass)super;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    *  Update the part size value (initially, it is the size of this part)
Packit b099d7
    */
Packit b099d7
   w_class->core_class.widget_size =
Packit b099d7
       _ALIGN(w_class->core_class.widget_size) + _ALIGN(super->core_class.widget_size);
Packit b099d7
   if (cc && scc)
Packit b099d7
       cc->constraint_class.constraint_size =
Packit b099d7
	   _ALIGN(cc->constraint_class.constraint_size) +
Packit b099d7
	       _ALIGN(scc->constraint_class.constraint_size);
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    *  Count the number of superclasses and allocate the offset record(s)
Packit b099d7
    */
Packit b099d7
   for (c = w_class; c != NULL; c = c->core_class.superclass) classcount++;
Packit b099d7
Packit b099d7
   *offset = (XmOffsetPtr) XtMalloc(classcount * sizeof(XmOffset));
Packit b099d7
Packit b099d7
   if (cc)
Packit b099d7
   {
Packit b099d7
       if(constraint_offset != NULL) 
Packit b099d7
	   *constraint_offset = (XmOffsetPtr) XtMalloc(classcount 
Packit b099d7
						       * sizeof(XmOffset));
Packit b099d7
   }
Packit b099d7
   else 
Packit b099d7
   {
Packit b099d7
       if(constraint_offset != NULL) *constraint_offset = NULL;
Packit b099d7
   }
Packit b099d7
   
Packit b099d7
   /*
Packit b099d7
    *  Fill in the offset table(s) with the offset of all parts
Packit b099d7
    */
Packit b099d7
   for (i = classcount-1, c = super; i > 0; c = c->core_class.superclass, i--)
Packit b099d7
       (*offset)[i] = c->core_class.widget_size;
Packit b099d7
Packit b099d7
   (*offset)[0] = 0;
Packit b099d7
Packit b099d7
   if (constraint_offset != NULL && *constraint_offset != NULL) {
Packit b099d7
       for (i = classcount-1, scc = (ConstraintWidgetClass) super; i > 0; 
Packit b099d7
	    scc = (ConstraintWidgetClass)(scc->core_class.superclass), i--)
Packit b099d7
	   if (IsConstraintClass((WidgetClass)scc))
Packit b099d7
	       (*constraint_offset)[i] = 
Packit b099d7
		   _ALIGN(scc->constraint_class.constraint_size);
Packit b099d7
	   else
Packit b099d7
	       (*constraint_offset)[i] = 0;
Packit b099d7
	
Packit b099d7
       (*constraint_offset)[0] = 0;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    *  Update the resource list(s) offsets in place
Packit b099d7
    */
Packit b099d7
   for (i = 0; i < w_class->core_class.num_resources; i++) 
Packit b099d7
   {
Packit b099d7
      pr = (XmPartResource *) &w_class->core_class.resources[i];
Packit b099d7
Packit b099d7
      /* The next line updates this in place--be careful */
Packit b099d7
Packit b099d7
      w_class->core_class.resources[i].resource_offset =
Packit b099d7
         XmGetPartOffset(pr, offset);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (cc && constraint_offset)
Packit b099d7
       for (i = 0; i < cc->constraint_class.num_resources; i++) 
Packit b099d7
       {
Packit b099d7
          pr = (XmPartResource *) &cc->constraint_class.resources[i];
Packit b099d7
Packit b099d7
          /* The next line updates this in place--be careful */
Packit b099d7
Packit b099d7
          cc->constraint_class.resources[i].resource_offset =
Packit b099d7
             XmGetPartOffset(pr, constraint_offset);
Packit b099d7
       }
Packit b099d7
Packit b099d7
   /*
Packit b099d7
    * deal with the synthetic resources. CR 9021
Packit b099d7
    */
Packit b099d7
Packit b099d7
   ResolveSyntheticOffsets(w_class, offset, constraint_offset);
Packit b099d7
   _XmProcessUnlock();
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
XmResolveAllPartOffsets(
Packit b099d7
        WidgetClass w_class,
Packit b099d7
        XmOffsetPtr *offset,
Packit b099d7
        XmOffsetPtr *constraint_offset )
Packit b099d7
{
Packit b099d7
    XmeResolvePartOffsets( w_class, offset, constraint_offset ) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
void 
Packit b099d7
XmResolvePartOffsets(
Packit b099d7
        WidgetClass w_class,
Packit b099d7
        XmOffsetPtr *offset)
Packit b099d7
{
Packit b099d7
    XmeResolvePartOffsets( w_class, offset, NULL) ;
Packit b099d7
}