Blame lib/Xm/Frame.c

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 REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: Frame.c /main/18 1996/10/15 15:01:45 cde-osf $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
/* (c) Copyright 1987, 1988, 1989, 1990, 1991, 1992 HEWLETT-PACKARD COMPANY */
Packit b099d7
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#include <Xm/DrawP.h>
Packit b099d7
#include <Xm/FrameP.h>
Packit b099d7
#include <Xm/GadgetP.h>
Packit b099d7
#include <Xm/VaSimpleP.h>
Packit b099d7
#include "GMUtilsI.h"
Packit b099d7
#include "RepTypeI.h"
Packit b099d7
#include "XmI.h"
Packit b099d7
Packit b099d7
#define GetFrameConstraint(w) \
Packit b099d7
        (&((XmFrameConstraintPtr) (w)->core.constraints)->frame)
Packit b099d7
Packit b099d7
Packit b099d7
/********    Static Function Declarations    ********/
Packit b099d7
static void CheckSetChildType(Widget wid, 
Packit b099d7
			      int offset, 
Packit b099d7
			      XrmValue *value); 
Packit b099d7
static void DrawShadow(
Packit b099d7
                        XmFrameWidget fw) ;
Packit b099d7
static void ClearShadow(
Packit b099d7
                        XmFrameWidget fw) ;
Packit b099d7
static void ConfigureChildren(
Packit b099d7
                        XmFrameWidget fw,
Packit b099d7
			Widget instigator,
Packit b099d7
			XtWidgetGeometry *inst_desired) ;
Packit b099d7
Packit b099d7
static void ClassPartInitialize( 
Packit b099d7
                        WidgetClass wc) ;
Packit b099d7
static void Initialize( 
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void Resize( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static void Redisplay( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XEvent *event,
Packit b099d7
                        Region region) ;
Packit b099d7
static XtGeometryResult GeometryManager( 
Packit b099d7
                        Widget w,
Packit b099d7
                        XtWidgetGeometry *request,
Packit b099d7
                        XtWidgetGeometry *reply) ;
Packit b099d7
static void ChangeManaged( 
Packit b099d7
                        Widget wid) ;
Packit b099d7
static Boolean SetValues( 
Packit b099d7
                        Widget cw,
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static XtGeometryResult QueryGeometry( 
Packit b099d7
                        Widget wid,
Packit b099d7
                        XtWidgetGeometry *request,
Packit b099d7
                        XtWidgetGeometry *ret) ;
Packit b099d7
static void CalcFrameSize( 
Packit b099d7
                        XmFrameWidget fw,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int titleWidth,
Packit b099d7
                        int titleHeight,
Packit b099d7
                        int titleBorder,
Packit b099d7
                        int workWidth,
Packit b099d7
                        int workHeight,
Packit b099d7
                        int workBorder,
Packit b099d7
#else
Packit b099d7
                        Dimension titleWidth,
Packit b099d7
                        Dimension titleHeight,
Packit b099d7
                        Dimension titleBorder,
Packit b099d7
                        Dimension workWidth,
Packit b099d7
                        Dimension workHeight,
Packit b099d7
                        Dimension workBorder,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
                        Dimension *fwWidth,
Packit b099d7
                        Dimension *fwHeight) ;
Packit b099d7
static void CalcWorkAreaSize( 
Packit b099d7
                        XmFrameWidget fw,
Packit b099d7
                        Dimension *workWidth,
Packit b099d7
                        Dimension *workHeight,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int workBorder,
Packit b099d7
                        int fwWidth,
Packit b099d7
                        int fwHeight) ;
Packit b099d7
#else
Packit b099d7
                        Dimension workBorder,
Packit b099d7
                        Dimension fwWidth,
Packit b099d7
                        Dimension fwHeight) ;
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
static void CalcTitleExtent(
Packit b099d7
                        XmFrameWidget fw,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
                        int titleHeight,
Packit b099d7
                        int titleBorder,
Packit b099d7
#else
Packit b099d7
                        Dimension titleHeight,
Packit b099d7
                        Dimension titleBorder,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
			Dimension *titleExtent,
Packit b099d7
			Position *titleY,
Packit b099d7
			Dimension *shadowWidth,
Packit b099d7
			Position *shadowY) ;
Packit b099d7
static void ConstraintInitialize(
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static Boolean ConstraintSetValues(
Packit b099d7
                        Widget cw,
Packit b099d7
                        Widget rw,
Packit b099d7
                        Widget nw,
Packit b099d7
                        ArgList args,
Packit b099d7
                        Cardinal *num_args) ;
Packit b099d7
static void ConstraintDestroy(
Packit b099d7
			Widget w) ;
Packit b099d7
Packit b099d7
/********    End Static Function Declarations    ********/
Packit b099d7
Packit b099d7
Packit b099d7
static XmSyntheticResource syn_resources[] = 
Packit b099d7
{
Packit b099d7
   {  XmNmarginWidth, 
Packit b099d7
      sizeof (Dimension),
Packit b099d7
      XtOffsetOf( struct _XmFrameRec, frame.margin_width),
Packit b099d7
      XmeFromHorizontalPixels,
Packit b099d7
      XmeToHorizontalPixels },
Packit b099d7
Packit b099d7
   {  XmNmarginHeight, 
Packit b099d7
      sizeof (Dimension),
Packit b099d7
      XtOffsetOf( struct _XmFrameRec, frame.margin_height),
Packit b099d7
      XmeFromVerticalPixels,
Packit b099d7
      XmeToVerticalPixels, }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XtResource resources[] =
Packit b099d7
{
Packit b099d7
   {  XmNmarginWidth, 
Packit b099d7
      XmCMarginWidth, 
Packit b099d7
      XmRHorizontalDimension, 
Packit b099d7
      sizeof (Dimension),
Packit b099d7
      XtOffsetOf( struct _XmFrameRec, frame.margin_width),
Packit b099d7
      XmRImmediate, (XtPointer) 0 },
Packit b099d7
Packit b099d7
   {  XmNmarginHeight, 
Packit b099d7
      XmCMarginHeight, 
Packit b099d7
      XmRVerticalDimension,
Packit b099d7
      sizeof (Dimension),
Packit b099d7
      XtOffsetOf( struct _XmFrameRec, frame.margin_height),
Packit b099d7
      XmRImmediate, (XtPointer) 0 },
Packit b099d7
Packit b099d7
   {  XmNshadowType,
Packit b099d7
      XmCShadowType,
Packit b099d7
      XmRShadowType,
Packit b099d7
      sizeof (unsigned char),
Packit b099d7
      XtOffsetOf( struct _XmFrameRec, frame.shadow_type),
Packit b099d7
      XmRImmediate, (XtPointer) XmINVALID_DIMENSION },
Packit b099d7
Packit b099d7
   {  XmNshadowThickness,
Packit b099d7
      XmCShadowThickness,
Packit b099d7
      XmRHorizontalDimension,
Packit b099d7
      sizeof (Dimension),
Packit b099d7
      XtOffsetOf( struct _XmFrameRec, manager.shadow_thickness),
Packit b099d7
      XmRImmediate, (XtPointer) XmINVALID_DIMENSION }
Packit b099d7
};
Packit b099d7
Packit b099d7
static XmSyntheticResource syn_constraints[] =
Packit b099d7
{
Packit b099d7
   {  XmNchildHorizontalSpacing, sizeof (Dimension),
Packit b099d7
      XtOffsetOf( struct _XmFrameConstraintRec, frame.child_h_spacing),
Packit b099d7
      XmeFromHorizontalPixels, XmeToHorizontalPixels }
Packit b099d7
};
Packit b099d7
Packit b099d7
Packit b099d7
static XtResource constraints[] =
Packit b099d7
{
Packit b099d7
   {  "pri.vate", "Pri.vate", XmRInt,
Packit b099d7
      sizeof (int),
Packit b099d7
      XtOffsetOf( struct _XmFrameConstraintRec, frame.unused),
Packit b099d7
      XmRImmediate, (XtPointer) 0 },
Packit b099d7
Packit b099d7
   {  XmNchildType, XmCChildType, XmRChildType,
Packit b099d7
      sizeof (unsigned char),
Packit b099d7
      XtOffsetOf( struct _XmFrameConstraintRec, frame.child_type),
Packit b099d7
      XmRCallProc, (XtPointer) CheckSetChildType },
Packit b099d7
Packit b099d7
   /* add a dup in 2.0 with new local names */
Packit b099d7
   {  XmNframeChildType, XmCFrameChildType, XmRChildType,
Packit b099d7
      sizeof (unsigned char),
Packit b099d7
      XtOffsetOf( struct _XmFrameConstraintRec, frame.child_type),
Packit b099d7
      XmRCallProc, (XtPointer) CheckSetChildType },
Packit b099d7
Packit b099d7
   {  XmNchildHorizontalAlignment, XmCChildHorizontalAlignment,
Packit b099d7
      XmRChildHorizontalAlignment,
Packit b099d7
      sizeof (unsigned char),
Packit b099d7
      XtOffsetOf( struct _XmFrameConstraintRec, frame.child_h_alignment),
Packit b099d7
      XmRImmediate, (XtPointer) XmALIGNMENT_BEGINNING },
Packit b099d7
Packit b099d7
   {  XmNchildVerticalAlignment, XmCChildVerticalAlignment,
Packit b099d7
      XmRChildVerticalAlignment,
Packit b099d7
      sizeof (unsigned char),
Packit b099d7
      XtOffsetOf( struct _XmFrameConstraintRec, frame.child_v_alignment),
Packit b099d7
      XmRImmediate, (XtPointer) XmALIGNMENT_CENTER   },
Packit b099d7
Packit b099d7
   {  XmNchildHorizontalSpacing, XmCChildHorizontalSpacing,
Packit b099d7
      XmRHorizontalDimension, sizeof (Dimension),
Packit b099d7
      XtOffsetOf( struct _XmFrameConstraintRec, frame.child_h_spacing),
Packit b099d7
      XmRImmediate, (XtPointer) XmINVALID_DIMENSION}
Packit b099d7
};
Packit b099d7
Packit b099d7
/****************************************************************
Packit b099d7
 *
Packit b099d7
 * Full class record constant
Packit b099d7
 *
Packit b099d7
 ****************************************************************/
Packit b099d7
Packit b099d7
externaldef(xmframeclassrec) XmFrameClassRec xmFrameClassRec = 
Packit b099d7
{
Packit b099d7
   {			/* core_class fields      */
Packit b099d7
      (WidgetClass) &xmManagerClassRec,		/* superclass         */
Packit b099d7
      "XmFrame",				/* class_name         */
Packit b099d7
      sizeof(XmFrameRec),			/* widget_size        */
Packit b099d7
      NULL,					/* class_initialize   */
Packit b099d7
      ClassPartInitialize,			/* class_part_init    */
Packit b099d7
      FALSE,					/* class_inited       */
Packit b099d7
      Initialize,       			/* initialize         */
Packit b099d7
      NULL,					/* initialize_hook    */
Packit b099d7
      XtInheritRealize,				/* realize            */
Packit b099d7
      NULL,					/* actions	      */
Packit b099d7
      0,					/* num_actions	      */
Packit b099d7
      resources,				/* resources          */
Packit b099d7
      XtNumber(resources),			/* num_resources      */
Packit b099d7
      NULLQUARK,				/* xrm_class          */
Packit b099d7
      TRUE,					/* compress_motion    */
Packit b099d7
      XtExposeCompressMaximal,	                /* compress_exposure  */
Packit b099d7
      TRUE,					/* compress_enterlv   */
Packit b099d7
      FALSE,					/* visible_interest   */
Packit b099d7
      NULL,					/* destroy            */
Packit b099d7
      Resize,			                /* resize             */
Packit b099d7
      Redisplay,		    	        /* expose             */
Packit b099d7
      SetValues,                		/* set_values         */
Packit b099d7
      NULL,					/* set_values_hook    */
Packit b099d7
      XtInheritSetValuesAlmost,			/* set_values_almost  */
Packit b099d7
      NULL,					/* get_values_hook    */
Packit b099d7
      NULL,					/* accept_focus       */
Packit b099d7
      XtVersion,				/* version            */
Packit b099d7
      NULL,					/* callback_private   */
Packit b099d7
      XtInheritTranslations,			/* tm_table           */
Packit b099d7
      QueryGeometry,	                        /* query_geometry     */
Packit b099d7
      NULL,                                     /* display_accelerator   */
Packit b099d7
      NULL,                                     /* extension             */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {		/* composite_class fields */
Packit b099d7
      GeometryManager,    	                /* geometry_manager   */
Packit b099d7
      ChangeManaged,		                /* change_managed     */
Packit b099d7
      XtInheritInsertChild,		        /* insert_child       */
Packit b099d7
      XtInheritDeleteChild,			/* delete_child       */
Packit b099d7
      NULL,                                     /* extension          */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {		/* constraint_class fields */
Packit b099d7
      constraints,				/* resource list        */   
Packit b099d7
      XtNumber(constraints),			/* num resources        */   
Packit b099d7
      sizeof (XmFrameConstraintRec),            /* constraint size      */   
Packit b099d7
      ConstraintInitialize,			/* init proc            */   
Packit b099d7
      ConstraintDestroy,			/* destroy proc         */   
Packit b099d7
      ConstraintSetValues,			/* set values proc      */   
Packit b099d7
      NULL,                                     /* extension            */
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {						/* manager class     */
Packit b099d7
      XtInheritTranslations,			/* translations      */
Packit b099d7
      syn_resources,				/* syn resources      	  */
Packit b099d7
      XtNumber(syn_resources),			/* num syn_resources 	  */
Packit b099d7
      syn_constraints,				/* get_cont_resources     */
Packit b099d7
      XtNumber(syn_constraints),		/* num_get_cont_resources */
Packit b099d7
      XmInheritParentProcess,                   /* parent_process         */
Packit b099d7
      NULL,					/* extension         */    
Packit b099d7
   },
Packit b099d7
Packit b099d7
   {						/* frame class       */
Packit b099d7
      NULL,					/* extension         */    
Packit b099d7
   }	
Packit b099d7
};
Packit b099d7
Packit b099d7
externaldef(xmframewidgetclass) WidgetClass xmFrameWidgetClass =
Packit b099d7
			                        (WidgetClass) &xmFrameClassRec;
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  CheckSetChildType
Packit b099d7
 *	default proc for the new childType resource.
Packit b099d7
 *      if this is called and child_type is INVALID, childType was
Packit b099d7
 *      not set, so default it, otherwise child_type was set and this
Packit b099d7
 *      one is not, so don't change it.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
CheckSetChildType(Widget wid,
Packit b099d7
		    int offset,
Packit b099d7
		    XrmValue *value)
Packit b099d7
{
Packit b099d7
    XmFrameConstraint fc = GetFrameConstraint(wid);
Packit b099d7
    static unsigned char child_type = XmFRAME_WORKAREA_CHILD ;
Packit b099d7
Packit b099d7
    if (fc->unused) /* Been here already, so default it .. */
Packit b099d7
	value->addr = (XPointer) &child_type;
Packit b099d7
    else {
Packit b099d7
	value->addr = (XPointer) &(fc->child_type);
Packit b099d7
	fc->unused = 1;
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  DrawShadow
Packit b099d7
 *	Draw the Frame shadow
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void
Packit b099d7
DrawShadow(
Packit b099d7
        XmFrameWidget fw )
Packit b099d7
{
Packit b099d7
   if (XtIsRealized((Widget)fw)) {
Packit b099d7
       XmeDrawShadows(XtDisplay (fw), XtWindow (fw),
Packit b099d7
		fw->manager.top_shadow_GC, fw->manager.bottom_shadow_GC,
Packit b099d7
		fw->frame.old_shadow_x, fw->frame.old_shadow_y,
Packit b099d7
		fw->frame.old_width, fw->frame.old_height,
Packit b099d7
		fw->frame.old_shadow_thickness, fw->frame.shadow_type);
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClearShadow
Packit b099d7
 *	Erase the Frame shadow
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void
Packit b099d7
ClearShadow(
Packit b099d7
        XmFrameWidget fw )
Packit b099d7
{
Packit b099d7
   if (XtIsRealized((Widget)fw)) {
Packit b099d7
	XmeClearBorder (XtDisplay(fw), XtWindow(fw),
Packit b099d7
		      fw->frame.old_shadow_x,
Packit b099d7
		      fw->frame.old_shadow_y, 
Packit b099d7
		      fw->frame.old_width, 
Packit b099d7
		      fw->frame.old_height,
Packit b099d7
		      fw->frame.old_shadow_thickness);
Packit b099d7
Packit b099d7
    }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ConfigureChildren
Packit b099d7
 *	Configure the title and work area if they aren't instigaror
Packit b099d7
 *      of the request (Yes policy). Compute the shadow location.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ConfigureChildren(
Packit b099d7
	XmFrameWidget fw,
Packit b099d7
	Widget instigator,
Packit b099d7
	XtWidgetGeometry * inst_geometry)
Packit b099d7
{
Packit b099d7
    Widget child;
Packit b099d7
    XmFrameConstraint fc;
Packit b099d7
    Position childX = 0;
Packit b099d7
    Position childY;
Packit b099d7
    Dimension childWidth;
Packit b099d7
    Dimension childHeight;
Packit b099d7
    Dimension childBW;
Packit b099d7
    Dimension shadowThickness = fw->manager.shadow_thickness;
Packit b099d7
    Dimension titleExtent = shadowThickness;
Packit b099d7
    Dimension shadowHeight = fw->core.height;
Packit b099d7
    Position shadowY = 0;
Packit b099d7
    XtWidgetGeometry title_reply;
Packit b099d7
    Dimension spacing;
Packit b099d7
Packit b099d7
    if (fw->frame.title_area && XtIsManaged(fw->frame.title_area)) {
Packit b099d7
	child = fw->frame.title_area;
Packit b099d7
	fc = GetFrameConstraint(child);
Packit b099d7
	spacing = shadowThickness + fc->child_h_spacing;
Packit b099d7
Packit b099d7
	/* asking the preferred geometry without constraint */
Packit b099d7
	XtQueryGeometry (child, NULL, &title_reply);
Packit b099d7
	childWidth = (title_reply.request_mode & CWWidth) ?
Packit b099d7
			title_reply.width : child->core.width;
Packit b099d7
	childHeight = (title_reply.request_mode & CWHeight) ?
Packit b099d7
			title_reply.height : child->core.height;
Packit b099d7
	childBW = child->core.border_width;
Packit b099d7
	if (child == instigator) {
Packit b099d7
	    childWidth = (inst_geometry->request_mode & CWWidth) ?
Packit b099d7
			inst_geometry->width : childWidth;
Packit b099d7
	    childHeight = (inst_geometry->request_mode & CWHeight) ?
Packit b099d7
			inst_geometry->height : childHeight;
Packit b099d7
	    childBW = (inst_geometry->request_mode & CWBorderWidth) ?
Packit b099d7
			inst_geometry->border_width : childBW;
Packit b099d7
	}
Packit b099d7
	if (childWidth + 2 * (spacing + childBW) > fw->core.width) {
Packit b099d7
	    if (fw->core.width > 2 * (spacing + childBW))
Packit b099d7
		childWidth = fw->core.width - 2 * (spacing + childBW);
Packit b099d7
	    else
Packit b099d7
		childWidth = 1;
Packit b099d7
	}
Packit b099d7
	switch (fc->child_h_alignment) {
Packit b099d7
	    case(XmALIGNMENT_BEGINNING):
Packit b099d7
		if (LayoutIsRtoLM(fw))
Packit b099d7
		    childX = fw->core.width - spacing -
Packit b099d7
				childWidth - 2 * childBW;
Packit b099d7
		else
Packit b099d7
		    childX = spacing;
Packit b099d7
		break;
Packit b099d7
	    case(XmALIGNMENT_CENTER):
Packit b099d7
		childX = fw->core.width/2 - childWidth/2 - childBW;
Packit b099d7
	        break;
Packit b099d7
	    case(XmALIGNMENT_END):
Packit b099d7
	    default:
Packit b099d7
		if (LayoutIsRtoLM(fw))
Packit b099d7
		    childX = spacing;
Packit b099d7
		else
Packit b099d7
		    childX = fw->core.width - spacing -
Packit b099d7
				childWidth - 2 * childBW;
Packit b099d7
		break;
Packit b099d7
	}
Packit b099d7
	CalcTitleExtent (fw, childHeight, childBW,
Packit b099d7
				&titleExtent, &childY, &shadowHeight, &shadowY);
Packit b099d7
Packit b099d7
	if (child != instigator) {
Packit b099d7
	    XmeConfigureObject (child, childX, childY, childWidth,
Packit b099d7
				childHeight, childBW);
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    /* Do not resize the instigator, just return GeometryYes */
Packit b099d7
Packit b099d7
	    inst_geometry->request_mode = CWX | CWY | CWWidth | CWHeight |
Packit b099d7
						CWBorderWidth;
Packit b099d7
	    child->core.x = childX; 
Packit b099d7
	    child->core.y = childY; 
Packit b099d7
	    child->core.width = childWidth; 
Packit b099d7
	    child->core.height = childHeight; 
Packit b099d7
	    child->core.border_width = childBW;
Packit b099d7
	}
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (fw->frame.work_area  && XtIsManaged(fw->frame.work_area)) {
Packit b099d7
	child = fw -> frame.work_area;
Packit b099d7
	if (child != instigator)
Packit b099d7
	    childBW = child->core.border_width;
Packit b099d7
	else
Packit b099d7
	    childBW = (inst_geometry->request_mode & CWBorderWidth) ?
Packit b099d7
		    inst_geometry->border_width : child->core.border_width;
Packit b099d7
	    
Packit b099d7
	CalcWorkAreaSize (fw, &childWidth, &childHeight, childBW,
Packit b099d7
			      fw->core.width, fw->core.height);
Packit b099d7
	childX = shadowThickness + fw->frame.margin_width;
Packit b099d7
	childY = titleExtent + fw->frame.margin_height;
Packit b099d7
	if (child != instigator) {
Packit b099d7
	    XmeConfigureObject (child, childX, childY, childWidth, childHeight,
Packit b099d7
				childBW);
Packit b099d7
	}
Packit b099d7
	else {
Packit b099d7
	    /* Do not resize the instigator, just return GeometryYes */
Packit b099d7
Packit b099d7
	    inst_geometry->request_mode = CWX | CWY | CWWidth | CWHeight |
Packit b099d7
						CWBorderWidth;
Packit b099d7
	    child->core.x = childX; 
Packit b099d7
	    child->core.y = childY; 
Packit b099d7
	    child->core.width = childWidth; 
Packit b099d7
	    child->core.height = childHeight; 
Packit b099d7
	    child->core.border_width = childBW;
Packit b099d7
	}   
Packit b099d7
    }
Packit b099d7
Packit b099d7
    fw->frame.old_shadow_x = 0;
Packit b099d7
    fw->frame.old_shadow_y = shadowY;
Packit b099d7
    fw->frame.old_width = fw->core.width;
Packit b099d7
    fw->frame.old_height = shadowHeight;
Packit b099d7
    fw->frame.old_shadow_thickness = shadowThickness;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ClassPartInitialize
Packit b099d7
 *     Set up the fast subclassing for the widget
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ClassPartInitialize(
Packit b099d7
        WidgetClass wc )
Packit b099d7
{
Packit b099d7
   _XmFastSubclassInit (wc, XmFRAME_BIT);
Packit b099d7
}
Packit b099d7
Packit b099d7
      
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Initialize
Packit b099d7
 *	Ensure that the width and height are not 0.
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
Initialize(
Packit b099d7
        Widget rw,
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
   XmFrameWidget request = (XmFrameWidget) rw ;
Packit b099d7
   XmFrameWidget new_w = (XmFrameWidget) nw;
Packit b099d7
Packit b099d7
   new_w->frame.title_area = NULL;
Packit b099d7
   new_w->frame.work_area = NULL;
Packit b099d7
   new_w->frame.processing_constraints = False;
Packit b099d7
Packit b099d7
   if (new_w->frame.shadow_type == (unsigned char) XmINVALID_DIMENSION)
Packit b099d7
   {
Packit b099d7
      if (XtIsShell (XtParent(new_w)))
Packit b099d7
      {
Packit b099d7
         new_w->frame.shadow_type = XmSHADOW_OUT;
Packit b099d7
      }
Packit b099d7
      else
Packit b099d7
      {
Packit b099d7
         new_w->frame.shadow_type = XmSHADOW_ETCHED_IN;
Packit b099d7
      }
Packit b099d7
  }
Packit b099d7
Packit b099d7
   if (!XmRepTypeValidValue( XmRID_SHADOW_TYPE, new_w->frame.shadow_type,
Packit b099d7
			(Widget) new_w))
Packit b099d7
   {
Packit b099d7
      new_w->frame.shadow_type = XmSHADOW_ETCHED_IN;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (request->manager.shadow_thickness == XmINVALID_DIMENSION)
Packit b099d7
   {
Packit b099d7
      if (XtIsShell (XtParent(new_w)))
Packit b099d7
      {
Packit b099d7
         new_w->manager.shadow_thickness = 1;
Packit b099d7
     }
Packit b099d7
      else
Packit b099d7
      {
Packit b099d7
         new_w->manager.shadow_thickness = 2;
Packit b099d7
     }
Packit b099d7
  }
Packit b099d7
   new_w->frame.old_shadow_x = 0;
Packit b099d7
   new_w->frame.old_shadow_y = 0;
Packit b099d7
   new_w->frame.old_width = new_w->core.width;
Packit b099d7
   new_w->frame.old_height = new_w->core.height;
Packit b099d7
   new_w->frame.old_shadow_thickness = new_w->manager.shadow_thickness;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Resize 
Packit b099d7
 *  	Calculate the size of the children and resize.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
Resize(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
   XmFrameWidget fw = (XmFrameWidget) wid ;
Packit b099d7
Packit b099d7
   ClearShadow(fw);
Packit b099d7
Packit b099d7
   ConfigureChildren(fw, NULL, NULL);
Packit b099d7
Packit b099d7
   DrawShadow(fw);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Redisplay
Packit b099d7
 *     General redisplay function called on exposure events.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
Redisplay(
Packit b099d7
        Widget wid,
Packit b099d7
        XEvent *event,
Packit b099d7
        Region region )
Packit b099d7
{
Packit b099d7
   XmFrameWidget fw = (XmFrameWidget) wid;
Packit b099d7
   Widget title_area = fw->frame.title_area;
Packit b099d7
Packit b099d7
   DrawShadow(fw);
Packit b099d7
Packit b099d7
   /* since the shadow may have screw up the gadget title, while this
Packit b099d7
      one won't get refresh, we have to redraw it manually */
Packit b099d7
Packit b099d7
   if (title_area && XmIsGadget(title_area) && XtIsManaged(title_area))
Packit b099d7
   {
Packit b099d7
      XClearArea (XtDisplay(fw), XtWindow(fw),
Packit b099d7
		  title_area->core.x, title_area->core.y,
Packit b099d7
		  title_area->core.width, title_area->core.height,
Packit b099d7
		  False);
Packit b099d7
      if (region && !XRectInRegion (region, title_area->core.x,
Packit b099d7
	title_area->core.y, title_area->core.width, title_area->core.height))
Packit b099d7
      {
Packit b099d7
	 XtExposeProc expose;
Packit b099d7
Packit b099d7
	 _XmProcessLock();
Packit b099d7
	 expose = title_area->core.widget_class->core_class.expose;
Packit b099d7
	 _XmProcessUnlock();
Packit b099d7
Packit b099d7
         if (expose)
Packit b099d7
	    (*expose)(title_area, event, NULL);
Packit b099d7
      }
Packit b099d7
   }
Packit b099d7
Packit b099d7
   XmeRedisplayGadgets( (Widget) fw, event, region);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Geometry Manager
Packit b099d7
 *	Take the requested geometry, calculate the needed size for
Packit b099d7
 *	the frame and make a request to the frames parent.
Packit b099d7
 *      Requests to change x, y position are always denied.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static XtGeometryResult 
Packit b099d7
GeometryManager(
Packit b099d7
        Widget w,
Packit b099d7
        XtWidgetGeometry *request,
Packit b099d7
        XtWidgetGeometry *reply )
Packit b099d7
{
Packit b099d7
   XmFrameWidget fw = (XmFrameWidget) XtParent(w);
Packit b099d7
   Widget title_area = fw->frame.title_area;
Packit b099d7
   Widget work_area = fw->frame.work_area;
Packit b099d7
   Dimension req_width, req_height, req_bw;
Packit b099d7
   Boolean query_only = False;
Packit b099d7
   Boolean almost = False;
Packit b099d7
   Dimension title_width = (title_area)?title_area->core.width:0;
Packit b099d7
   Dimension title_height = (title_area)?title_area->core.height:0;
Packit b099d7
   Dimension title_bw = (title_area)?title_area->core.border_width:0;
Packit b099d7
   Dimension work_width = (work_area)?work_area->core.width:0;
Packit b099d7
   Dimension work_height = (work_area)?work_area->core.height:0;
Packit b099d7
   Dimension work_bw = (work_area)?work_area->core.border_width:0;
Packit b099d7
   Dimension frame_width, frame_height;
Packit b099d7
   XtWidgetGeometry parent_request;
Packit b099d7
   XtWidgetGeometry parent_reply;
Packit b099d7
   Dimension almost_width;
Packit b099d7
   Dimension almost_height;
Packit b099d7
Packit b099d7
   if (fw->frame.processing_constraints)
Packit b099d7
   {
Packit b099d7
      fw->frame.processing_constraints = False;
Packit b099d7
      request -> border_width -= 1;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /*  Set up the calculation variables according to the  */
Packit b099d7
   /*  contents of the requested geometry.                */
Packit b099d7
Packit b099d7
   if (request -> request_mode & XtCWQueryOnly)
Packit b099d7
      query_only = True;
Packit b099d7
Packit b099d7
   if ((request -> request_mode & CWX) || (request -> request_mode & CWY))
Packit b099d7
      almost = True;
Packit b099d7
Packit b099d7
   if (request -> request_mode & CWWidth) req_width = request -> width;
Packit b099d7
   else req_width = w -> core.width;
Packit b099d7
Packit b099d7
   if (request -> request_mode & CWHeight) req_height = request -> height;
Packit b099d7
   else req_height = w -> core.height;
Packit b099d7
Packit b099d7
   if (request -> request_mode & CWBorderWidth)
Packit b099d7
       req_bw = request -> border_width;
Packit b099d7
   else req_bw = w -> core.border_width;
Packit b099d7
Packit b099d7
   if (w == title_area)
Packit b099d7
   {
Packit b099d7
      title_width = req_width;
Packit b099d7
      title_height = req_height;
Packit b099d7
      title_bw = req_bw;
Packit b099d7
   }
Packit b099d7
   if (w == work_area)
Packit b099d7
   {
Packit b099d7
      work_width = req_width;
Packit b099d7
      work_height = req_height;
Packit b099d7
      work_bw = req_bw;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   /* find the frame size based on the children preferred geometry */
Packit b099d7
Packit b099d7
   CalcFrameSize (fw, title_width, title_height, title_bw,
Packit b099d7
		  work_width, work_height, work_bw,
Packit b099d7
		  &frame_width, &frame_height);
Packit b099d7
Packit b099d7
   parent_request.request_mode = CWWidth | CWHeight;
Packit b099d7
   if (almost || query_only) parent_request.request_mode |= XtCWQueryOnly;
Packit b099d7
   parent_request.width = frame_width;
Packit b099d7
   parent_request.height = frame_height;
Packit b099d7
Packit b099d7
   switch (XtMakeGeometryRequest ((Widget)fw, 
Packit b099d7
				  &parent_request, &parent_reply)) {
Packit b099d7
   case XtGeometryYes:
Packit b099d7
       if (!almost) {
Packit b099d7
	   if (!query_only) {
Packit b099d7
	       ClearShadow(fw);
Packit b099d7
	       ConfigureChildren(fw, w, request);
Packit b099d7
	       DrawShadow(fw);
Packit b099d7
	   }
Packit b099d7
	   return (XtGeometryYes);
Packit b099d7
         } else {
Packit b099d7
	     almost_width = request->width;
Packit b099d7
	     almost_height = request->height;
Packit b099d7
	 }
Packit b099d7
       break;
Packit b099d7
   case XtGeometryNo:
Packit b099d7
	 if (w == title_area) { 
Packit b099d7
	     /* we got a No, try to honor the title request anyway,
Packit b099d7
	        by resizing the work_area child */
Packit b099d7
	     if (!almost) {
Packit b099d7
		 if (!query_only) {
Packit b099d7
		     ClearShadow(fw);
Packit b099d7
		     ConfigureChildren(fw, w, request);
Packit b099d7
		     DrawShadow(fw);
Packit b099d7
		 }
Packit b099d7
		 return (XtGeometryYes);
Packit b099d7
	     } else {
Packit b099d7
		 almost_width = request->width;
Packit b099d7
		 almost_height = request->height;
Packit b099d7
	     }
Packit b099d7
	 } else return (XtGeometryNo);
Packit b099d7
         break;
Packit b099d7
Packit b099d7
   case XtGeometryAlmost:
Packit b099d7
	 if (w == title_area) {
Packit b099d7
	     /* we got an Almost, try to honor the title request anyway,
Packit b099d7
	        by accepting the deal and resizing the work_area child */
Packit b099d7
	     if (!almost) {
Packit b099d7
		 if (!query_only) {
Packit b099d7
		     ClearShadow(fw);
Packit b099d7
		     XtMakeResizeRequest((Widget)fw, parent_reply.width,
Packit b099d7
					 parent_reply.height, NULL, NULL); 
Packit b099d7
		     ConfigureChildren(fw, w, request);
Packit b099d7
		 }
Packit b099d7
		 return (XtGeometryYes);
Packit b099d7
	     } else {
Packit b099d7
		 almost_width = request->width;
Packit b099d7
		 almost_height = request->height;
Packit b099d7
	     }
Packit b099d7
	 } else {
Packit b099d7
	     /* we got an Almost, accept the deal and 
Packit b099d7
		compute the work_area size */
Packit b099d7
	     CalcWorkAreaSize (fw, &almost_width, &almost_height,
Packit b099d7
			       req_bw, parent_reply.width, 
Packit b099d7
			       parent_reply.height);
Packit b099d7
	 }
Packit b099d7
         break;
Packit b099d7
   default:
Packit b099d7
         return (XtGeometryNo);
Packit b099d7
	 break;
Packit b099d7
   }
Packit b099d7
Packit b099d7
Packit b099d7
   /*  Fallen through to an almost condition.  Clear the x and y  */
Packit b099d7
   /*  and set the width, height, and border.                     */
Packit b099d7
Packit b099d7
Packit b099d7
   if (reply != NULL) {
Packit b099d7
      reply -> request_mode = request -> request_mode & ~(CWX | CWY);
Packit b099d7
      reply -> width = almost_width;
Packit b099d7
      reply -> height = almost_height;
Packit b099d7
      reply -> border_width = req_bw;
Packit b099d7
      if (request -> request_mode & CWSibling)
Packit b099d7
               reply -> sibling = request -> sibling;
Packit b099d7
      if (request -> request_mode & CWStackMode)
Packit b099d7
               reply -> stack_mode = request -> stack_mode;
Packit b099d7
      return (XtGeometryAlmost);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   return (XtGeometryNo);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  ChangeManaged
Packit b099d7
 *	Process a changed in managed state of the child.  If its
Packit b099d7
 *	size is out of sync with the frame, make a resize request
Packit b099d7
 *	to change the size of the frame.
Packit b099d7
 *	Note: called before ConstraintDestroy.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
ChangeManaged(
Packit b099d7
        Widget wid )
Packit b099d7
{
Packit b099d7
   XmFrameWidget fw = (XmFrameWidget) wid ;
Packit b099d7
Packit b099d7
   Widget title_area = (fw->frame.title_area &&
Packit b099d7
			XtIsManaged(fw->frame.title_area)) ?
Packit b099d7
			fw->frame.title_area : (Widget) NULL;
Packit b099d7
   Dimension t_w = 0;
Packit b099d7
   Dimension t_h = 0;
Packit b099d7
   Dimension t_bw = (title_area) ? title_area->core.border_width : 0;
Packit b099d7
Packit b099d7
   Widget work_area = (fw->frame.work_area &&
Packit b099d7
			XtIsManaged(fw->frame.work_area)) ?
Packit b099d7
			fw->frame.work_area : (Widget) NULL;
Packit b099d7
Packit b099d7
   Dimension w_w = (work_area) ? work_area->core.width : 0;
Packit b099d7
   Dimension w_h = (work_area) ? work_area->core.height : 0;
Packit b099d7
   Dimension w_bw = (work_area) ? work_area->core.border_width : 0;
Packit b099d7
   Dimension fwWidth, fwHeight;
Packit b099d7
Packit b099d7
   if (title_area) 
Packit b099d7
   {                                          
Packit b099d7
	/* We don't want the current size of the title object -- width/height
Packit b099d7
	** may have been set on it. Because we'll be forcing it to the size we
Packit b099d7
	** want (see ConfigureChildren), we must use the "natural" size here,
Packit b099d7
	** so query its value now. (Use current border_width.)
Packit b099d7
        */
Packit b099d7
	XtWidgetGeometry title_reply;                           
Packit b099d7
	XtQueryGeometry (title_area, NULL, &title_reply);      
Packit b099d7
	t_w = (title_reply.request_mode & CWWidth) ?          
Packit b099d7
		title_reply.width : title_area->core.width;   
Packit b099d7
	t_h = (title_reply.request_mode & CWHeight) ?       
Packit b099d7
		title_reply.height : title_area->core.height;
Packit b099d7
   }                             
Packit b099d7
Packit b099d7
   /* need to  check on initial sizing (not null) */
Packit b099d7
   if (XtIsRealized((Widget)fw) || (XtWidth(fw) == 0) || (XtHeight(fw) == 0)) {
Packit b099d7
       CalcFrameSize (fw, t_w, t_h, t_bw, w_w, w_h, w_bw,
Packit b099d7
		      &fwWidth, &fwHeight);
Packit b099d7
Packit b099d7
       while (XtMakeResizeRequest ((Widget) fw, 
Packit b099d7
				   fwWidth, fwHeight,
Packit b099d7
				   &fwWidth, &fwHeight) == XtGeometryAlmost) 
Packit b099d7
	 /*EMPTY*/;
Packit b099d7
       ClearShadow(fw);
Packit b099d7
   }
Packit b099d7
 
Packit b099d7
   ConfigureChildren(fw, NULL, NULL);
Packit b099d7
Packit b099d7
   DrawShadow(fw);
Packit b099d7
Packit b099d7
   XmeNavigChangeManaged((Widget) fw);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Set Values
Packit b099d7
 *	Adjust the size of the manager based on shadow thickness
Packit b099d7
 *	changes.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
SetValues(
Packit b099d7
        Widget cw,
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
   XmFrameWidget current = (XmFrameWidget) cw ;
Packit b099d7
   XmFrameWidget new_w = (XmFrameWidget) nw ;
Packit b099d7
   Boolean redisplay = False;
Packit b099d7
   Widget title_area = (new_w->frame.title_area &&
Packit b099d7
			XtIsManaged(new_w->frame.title_area)) ?
Packit b099d7
			new_w->frame.title_area : NULL;
Packit b099d7
   Dimension t_w = (title_area) ? title_area->core.width : 0;
Packit b099d7
   Dimension t_h = (title_area) ? title_area->core.height : 0;
Packit b099d7
   Dimension t_bw = (title_area) ? title_area->core.border_width : 0;
Packit b099d7
Packit b099d7
   Widget work_area = (new_w->frame.work_area &&
Packit b099d7
			XtIsManaged(new_w->frame.work_area)) ?
Packit b099d7
			new_w->frame.work_area : (Widget) NULL;
Packit b099d7
   Dimension w_w = (work_area) ? work_area->core.width : 0;
Packit b099d7
   Dimension w_h = (work_area) ? work_area->core.height : 0;
Packit b099d7
   Dimension w_bw = (work_area) ? work_area->core.border_width : 0;
Packit b099d7
Packit b099d7
Packit b099d7
   if (!XmRepTypeValidValue( XmRID_SHADOW_TYPE, new_w->frame.shadow_type,
Packit b099d7
			(Widget) new_w))
Packit b099d7
   {
Packit b099d7
      new_w->frame.shadow_type = current->frame.shadow_type;
Packit b099d7
   }
Packit b099d7
Packit b099d7
    if (!XtIsRealized((Widget)new_w)) return False ;
Packit b099d7
Packit b099d7
   if (new_w->frame.margin_width != current->frame.margin_width ||
Packit b099d7
       new_w->frame.margin_height != current->frame.margin_height ||
Packit b099d7
       new_w->manager.shadow_thickness != current->manager.shadow_thickness)
Packit b099d7
   {
Packit b099d7
      CalcFrameSize (new_w, t_w, t_h, t_bw, w_w, w_h, w_bw,
Packit b099d7
			&new_w->core.width, &new_w->core.height);
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (new_w -> frame.shadow_type != current -> frame.shadow_type ||
Packit b099d7
       new_w->frame.margin_width != current->frame.margin_width ||
Packit b099d7
       new_w->frame.margin_height != current->frame.margin_height ||
Packit b099d7
       new_w->manager.shadow_thickness != current->manager.shadow_thickness)
Packit b099d7
   {
Packit b099d7
     redisplay = True;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   return (redisplay);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  QueryGeometry
Packit b099d7
 *  	return width X height based on the children preferred sizes
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static XtGeometryResult 
Packit b099d7
QueryGeometry(
Packit b099d7
        Widget widget,
Packit b099d7
        XtWidgetGeometry *intended,
Packit b099d7
        XtWidgetGeometry *desired )
Packit b099d7
{
Packit b099d7
    Dimension work_width = 0, work_height = 0, work_bw = 0 ;
Packit b099d7
    Dimension title_width = 0, title_height = 0, title_bw = 0 ;
Packit b099d7
    XtWidgetGeometry child_pref ;
Packit b099d7
    XmFrameWidget fw = (XmFrameWidget) widget ;
Packit b099d7
Packit b099d7
    /* first determine what is the desired size, using the
Packit b099d7
       preferred sizes of the title and the work_area, or the
Packit b099d7
       current setting if no preference are given */
Packit b099d7
    if (fw->frame.work_area) {
Packit b099d7
	XtQueryGeometry (fw->frame.work_area, NULL, &child_pref);    
Packit b099d7
	if (IsWidth(&child_pref)) work_width = child_pref.width ;
Packit b099d7
	else work_width = XtWidth(fw->frame.work_area);
Packit b099d7
	if (IsHeight(&child_pref)) work_height = child_pref.height ;
Packit b099d7
	else work_height = XtHeight(fw->frame.work_area);
Packit b099d7
	if (IsBorder(&child_pref)) work_bw = child_pref.border_width ;
Packit b099d7
	else work_bw = XtBorderWidth(fw->frame.work_area);
Packit b099d7
    } 
Packit b099d7
    if (fw->frame.title_area) {
Packit b099d7
	XtQueryGeometry (fw->frame.title_area, NULL, &child_pref);    
Packit b099d7
	if (IsWidth(&child_pref)) title_width = child_pref.width ;
Packit b099d7
	else title_width = XtWidth(fw->frame.title_area);
Packit b099d7
	if (IsHeight(&child_pref)) title_height = child_pref.height ;
Packit b099d7
	else title_height = XtHeight(fw->frame.title_area);
Packit b099d7
	if (IsBorder(&child_pref)) title_bw = child_pref.border_width ;
Packit b099d7
	else title_bw = XtBorderWidth(fw->frame.title_area);
Packit b099d7
    }
Packit b099d7
Packit b099d7
    CalcFrameSize (fw, 
Packit b099d7
		   title_width, title_height, title_bw,
Packit b099d7
		   work_width, work_height, work_bw,
Packit b099d7
		   &desired->width, &desired->height);
Packit b099d7
Packit b099d7
    /* deal with user initial size setting */
Packit b099d7
    if (!XtIsRealized(widget))  {
Packit b099d7
	if (XtWidth(widget) != 0) desired->width = XtWidth(widget) ;
Packit b099d7
	if (XtHeight(widget) != 0) desired->height = XtHeight(widget) ;
Packit b099d7
    }	    
Packit b099d7
Packit b099d7
    return XmeReplyToQueryGeometry(widget, intended, desired) ;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  CalcFrameSize
Packit b099d7
 *	Calculate the manager size based on the supplied width 
Packit b099d7
 *	and height.
Packit b099d7
 *  Note: all of the dimensions passed in may be 0, in which case the return
Packit b099d7
 *  value is based on the frame's own visuals.
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
CalcFrameSize(
Packit b099d7
        XmFrameWidget fw,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int titleWidth,
Packit b099d7
        int titleHeight,
Packit b099d7
        int titleBorder,
Packit b099d7
        int workWidth,
Packit b099d7
        int workHeight,
Packit b099d7
        int workBorder,
Packit b099d7
#else
Packit b099d7
        Dimension titleWidth,
Packit b099d7
        Dimension titleHeight,
Packit b099d7
        Dimension titleBorder,
Packit b099d7
        Dimension workWidth,
Packit b099d7
        Dimension workHeight,
Packit b099d7
        Dimension workBorder,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
        Dimension *fwWidth,
Packit b099d7
        Dimension *fwHeight )
Packit b099d7
{
Packit b099d7
   Dimension shadowThickness = fw->manager.shadow_thickness;
Packit b099d7
   Dimension titleExtent = shadowThickness;
Packit b099d7
   Dimension workMax = 0;
Packit b099d7
   Dimension titleMax = 0;
Packit b099d7
Packit b099d7
   if (fw->frame.title_area && XtIsManaged(fw->frame.title_area)) {
Packit b099d7
      XmFrameConstraint fc = GetFrameConstraint(fw->frame.title_area);
Packit b099d7
Packit b099d7
      CalcTitleExtent (fw, titleHeight, titleBorder, &titleExtent, NULL,
Packit b099d7
		NULL, NULL);
Packit b099d7
      titleMax = 2 * (shadowThickness + titleBorder + fc->child_h_spacing) +
Packit b099d7
		titleWidth;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   workMax = 2 * (workBorder + shadowThickness + fw->frame.margin_width) +
Packit b099d7
		workWidth;
Packit b099d7
Packit b099d7
   *fwWidth =  MAX (workMax, titleMax);
Packit b099d7
   if (*fwWidth == 0) *fwWidth = 1;
Packit b099d7
Packit b099d7
   *fwHeight = workHeight + 2 * (workBorder + fw->frame.margin_height) +
Packit b099d7
       shadowThickness + titleExtent;
Packit b099d7
   if (*fwHeight == 0) *fwHeight = 1;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  CalcWorkAreaSize
Packit b099d7
 *	Calculate the work area size based on the supplied width 
Packit b099d7
 *	and height.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
CalcWorkAreaSize(
Packit b099d7
        XmFrameWidget fw,
Packit b099d7
        Dimension *workWidth,
Packit b099d7
        Dimension *workHeight,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int workBorder,
Packit b099d7
        int fwWidth,
Packit b099d7
        int fwHeight )
Packit b099d7
#else
Packit b099d7
        Dimension workBorder,
Packit b099d7
        Dimension fwWidth,
Packit b099d7
        Dimension fwHeight )
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
{
Packit b099d7
   Widget title = fw->frame.title_area;
Packit b099d7
   Dimension shadowThickness = fw->manager.shadow_thickness;
Packit b099d7
   Dimension titleExtent = shadowThickness;
Packit b099d7
   int temp;
Packit b099d7
Packit b099d7
   if (title && XtIsManaged(title))
Packit b099d7
      CalcTitleExtent (fw, title->core.height, title->core.border_width,
Packit b099d7
			&titleExtent, NULL, NULL, NULL);
Packit b099d7
Packit b099d7
   temp = (int) fwWidth - 
Packit b099d7
          (int) (2 * (workBorder + shadowThickness + fw->frame.margin_width));
Packit b099d7
Packit b099d7
   if (temp <= 0) *workWidth = 1;
Packit b099d7
   else *workWidth = (Dimension) temp;
Packit b099d7
Packit b099d7
   temp = (int) fwHeight - 
Packit b099d7
          (int) (2 * (workBorder + fw->frame.margin_height) +
Packit b099d7
                shadowThickness + titleExtent);
Packit b099d7
Packit b099d7
   if (temp <= 0) *workHeight = 1;
Packit b099d7
   else *workHeight = (Dimension) temp;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  CalcTitleExtent
Packit b099d7
 *	Calculate layout parameters which depend on the title.
Packit b099d7
 *
Packit b099d7
 *	titleExtent:	vertical space above the work area.
Packit b099d7
 *	titleY:		y position of the title.
Packit b099d7
 *	shadowHeight:	vertical size of the shadow rectangle.
Packit b099d7
 *	shadowY:	y position of the shadow rectangle.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
static void 
Packit b099d7
CalcTitleExtent(
Packit b099d7
        XmFrameWidget fw,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
        int titleHeight,
Packit b099d7
        int titleBorder,
Packit b099d7
#else
Packit b099d7
        Dimension titleHeight,
Packit b099d7
        Dimension titleBorder,
Packit b099d7
#endif /* NeedWidePrototypes */
Packit b099d7
        Dimension *titleExtent,
Packit b099d7
        Position *titleY,
Packit b099d7
        Dimension *shadowHeight,
Packit b099d7
        Position *shadowY)
Packit b099d7
{
Packit b099d7
    XmFrameConstraint fc = GetFrameConstraint(fw->frame.title_area);
Packit b099d7
    Dimension shadowThickness = fw->manager.shadow_thickness;
Packit b099d7
    Dimension extent;
Packit b099d7
    Position ty;
Packit b099d7
    Dimension sh;
Packit b099d7
    Position sy;
Packit b099d7
    Dimension base;
Packit b099d7
    Dimension *lines;
Packit b099d7
    int nlines;
Packit b099d7
    Dimension total = titleHeight + 2 * titleBorder;
Packit b099d7
Packit b099d7
    switch (fc->child_v_alignment) {
Packit b099d7
	case(XmALIGNMENT_BASELINE_TOP):
Packit b099d7
	case(XmALIGNMENT_BASELINE_BOTTOM):
Packit b099d7
	    if (XmWidgetGetBaselines (fw->frame.title_area, &lines, &nlines)) {
Packit b099d7
		if (fc->child_v_alignment == XmALIGNMENT_BASELINE_TOP)
Packit b099d7
		    base = lines[0];
Packit b099d7
		else
Packit b099d7
		    base = lines[nlines - 1];
Packit b099d7
		XtFree((char *)lines);
Packit b099d7
	    }
Packit b099d7
	    else {
Packit b099d7
		base = total/2;
Packit b099d7
	    }
Packit b099d7
	    ty = (base + titleBorder > shadowThickness/2) ?
Packit b099d7
		0 : shadowThickness/2 - (base + titleBorder);
Packit b099d7
	    extent = ty + MAX(total, titleBorder + base + shadowThickness/2);
Packit b099d7
	    sy = (base + titleBorder > shadowThickness/2) ?
Packit b099d7
		base + titleBorder - shadowThickness/2 : 0;
Packit b099d7
	    sh = ((Dimension) sy >= fw->core.height) ? 
Packit b099d7
		1 : fw->core.height - sy;
Packit b099d7
	    break;
Packit b099d7
	case(XmALIGNMENT_CENTER):
Packit b099d7
	    ty = (total > shadowThickness) ? 0 : (shadowThickness - total)/2;
Packit b099d7
	    extent = MAX(shadowThickness, total);
Packit b099d7
            sy = (shadowThickness > total) ? 0 : total/2 - shadowThickness/2;
Packit b099d7
	    sh = ((Dimension) sy >= fw->core.height) ? 
Packit b099d7
		1 : fw->core.height - sy;
Packit b099d7
	    break;
Packit b099d7
	case(XmALIGNMENT_WIDGET_TOP):
Packit b099d7
	    ty = 0;
Packit b099d7
	    extent = shadowThickness + total;
Packit b099d7
	    sy = total;
Packit b099d7
	    sh = ((Dimension) sy >= fw->core.height) ? 
Packit b099d7
		1 : fw->core.height - sy;
Packit b099d7
	    break;
Packit b099d7
	case(XmALIGNMENT_WIDGET_BOTTOM):
Packit b099d7
	default:
Packit b099d7
	    ty = shadowThickness;
Packit b099d7
	    extent = shadowThickness + total;
Packit b099d7
	    sy = 0;
Packit b099d7
	    sh = fw->core.height;
Packit b099d7
	    break;
Packit b099d7
    }
Packit b099d7
Packit b099d7
    if (titleExtent) *titleExtent = extent;
Packit b099d7
    if (titleY) *titleY = ty;
Packit b099d7
    if (shadowHeight) *shadowHeight = sh;
Packit b099d7
    if (shadowY) *shadowY = sy;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Constraint Initialize
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static void 
Packit b099d7
ConstraintInitialize(
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
   XmFrameConstraint nc;
Packit b099d7
   XmFrameConstraint bc;
Packit b099d7
   XmFrameWidget fw;
Packit b099d7
Packit b099d7
   if (!XtIsRectObj (nw)) return;
Packit b099d7
Packit b099d7
   nc = GetFrameConstraint(nw);
Packit b099d7
   fw = (XmFrameWidget)XtParent(nw);
Packit b099d7
Packit b099d7
   if (!XmRepTypeValidValue( XmRID_CHILD_TYPE, nc->child_type, nw))
Packit b099d7
   {
Packit b099d7
      nc->child_type = XmFRAME_GENERIC_CHILD;
Packit b099d7
   }
Packit b099d7
   else
Packit b099d7
   {
Packit b099d7
      switch (nc->child_type)
Packit b099d7
      {
Packit b099d7
	 case (XmFRAME_TITLE_CHILD) :
Packit b099d7
	    if (fw->frame.title_area != NULL) {
Packit b099d7
		bc = GetFrameConstraint(fw->frame.title_area);
Packit b099d7
		bc->child_type = XmFRAME_GENERIC_CHILD;
Packit b099d7
	    }
Packit b099d7
	    fw->frame.title_area = nw;
Packit b099d7
            if (nc->child_h_spacing == (Dimension) XmINVALID_DIMENSION)
Packit b099d7
                nc->child_h_spacing = MAX(10,fw->frame.margin_width);
Packit b099d7
            break;
Packit b099d7
         case (XmFRAME_WORKAREA_CHILD) :
Packit b099d7
            if (fw->frame.work_area != NULL) {
Packit b099d7
                bc = GetFrameConstraint(fw->frame.work_area);
Packit b099d7
                bc->child_type = XmFRAME_GENERIC_CHILD;
Packit b099d7
	    }
Packit b099d7
            fw->frame.work_area = nw;
Packit b099d7
            break;
Packit b099d7
         case (XmFRAME_GENERIC_CHILD) :
Packit b099d7
            break;
Packit b099d7
      }
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (!XmRepTypeValidValue( XmRID_CHILD_HORIZONTAL_ALIGNMENT,
Packit b099d7
			nc->child_h_alignment, nw))
Packit b099d7
   {
Packit b099d7
      nc->child_h_alignment = XmALIGNMENT_BEGINNING;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (!XmRepTypeValidValue( XmRID_CHILD_VERTICAL_ALIGNMENT,
Packit b099d7
			nc->child_v_alignment, nw))
Packit b099d7
   {
Packit b099d7
      nc->child_v_alignment = XmALIGNMENT_CENTER;
Packit b099d7
   }
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Constraint SetValues
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
/*ARGSUSED*/
Packit b099d7
static Boolean 
Packit b099d7
ConstraintSetValues(
Packit b099d7
        Widget cw,
Packit b099d7
        Widget rw,		/* unused */
Packit b099d7
        Widget nw,
Packit b099d7
        ArgList args,		/* unused */
Packit b099d7
        Cardinal *num_args )	/* unused */
Packit b099d7
{
Packit b099d7
   XmFrameConstraint nc;
Packit b099d7
   XmFrameConstraint cc;
Packit b099d7
   XmFrameConstraint bc;
Packit b099d7
   XmFrameWidget fw;
Packit b099d7
   Boolean reconfigure = False;
Packit b099d7
Packit b099d7
   if (!XtIsRectObj (nw)) return (False);
Packit b099d7
Packit b099d7
   nc = GetFrameConstraint(nw);
Packit b099d7
   cc = GetFrameConstraint(cw);
Packit b099d7
   fw = (XmFrameWidget)XtParent(nw);
Packit b099d7
Packit b099d7
   if (nc->child_type != cc->child_type)
Packit b099d7
   {
Packit b099d7
      if(    !XmRepTypeValidValue( XmRID_CHILD_TYPE, nc->child_type, nw)    )
Packit b099d7
      {
Packit b099d7
         nc->child_type = cc->child_type;
Packit b099d7
      }
Packit b099d7
      else
Packit b099d7
      {
Packit b099d7
        switch(nc->child_type)
Packit b099d7
        {
Packit b099d7
         case (XmFRAME_TITLE_CHILD) :
Packit b099d7
	    if (fw->frame.title_area != NULL) {
Packit b099d7
		bc = GetFrameConstraint(fw->frame.title_area);
Packit b099d7
		bc->child_type = XmFRAME_GENERIC_CHILD;
Packit b099d7
	    }
Packit b099d7
	    fw->frame.title_area = nw;
Packit b099d7
            if (nc->child_h_spacing == (Dimension) XmINVALID_DIMENSION)
Packit b099d7
                nc->child_h_spacing = MAX(10,fw->frame.margin_width);
Packit b099d7
            break;
Packit b099d7
         case (XmFRAME_WORKAREA_CHILD) :
Packit b099d7
            if (fw->frame.work_area != NULL) {
Packit b099d7
                bc = GetFrameConstraint(fw->frame.work_area);
Packit b099d7
                bc->child_type = XmFRAME_GENERIC_CHILD;
Packit b099d7
	    }
Packit b099d7
            fw->frame.work_area = nw;
Packit b099d7
            break;
Packit b099d7
         case (XmFRAME_GENERIC_CHILD) :
Packit b099d7
            if (nw == fw->frame.title_area)
Packit b099d7
               fw->frame.title_area = NULL;
Packit b099d7
            else if (nw == fw->frame.work_area)
Packit b099d7
               fw->frame.work_area = NULL;
Packit b099d7
            break;
Packit b099d7
        }
Packit b099d7
      }
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (nc->child_h_alignment != cc->child_h_alignment &&
Packit b099d7
      !XmRepTypeValidValue( XmRID_CHILD_HORIZONTAL_ALIGNMENT,
Packit b099d7
			nc->child_h_alignment, nw))
Packit b099d7
   {
Packit b099d7
      nc->child_h_alignment = cc->child_h_alignment;
Packit b099d7
   }
Packit b099d7
   if (nc->child_v_alignment != cc->child_v_alignment &&
Packit b099d7
      !XmRepTypeValidValue( XmRID_CHILD_VERTICAL_ALIGNMENT,
Packit b099d7
			nc->child_v_alignment, nw))
Packit b099d7
   {
Packit b099d7
      nc->child_v_alignment = cc->child_v_alignment;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (nc->child_type == XmFRAME_TITLE_CHILD &&
Packit b099d7
      (nc->child_h_alignment != cc->child_h_alignment ||
Packit b099d7
       nc->child_h_spacing != cc->child_h_spacing ||
Packit b099d7
       nc->child_v_alignment != cc->child_v_alignment))
Packit b099d7
   {
Packit b099d7
      reconfigure = True;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (nc->child_type != cc->child_type)
Packit b099d7
   {
Packit b099d7
      reconfigure = True;
Packit b099d7
   }
Packit b099d7
Packit b099d7
   if (reconfigure && XtIsManaged (nw) && XtIsRealized (nw))
Packit b099d7
   {
Packit b099d7
      fw->frame.processing_constraints = True;
Packit b099d7
      nw->core.border_width+=1; /* force call to GM */
Packit b099d7
      return (True);
Packit b099d7
  }
Packit b099d7
Packit b099d7
   return (False);
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  Constraint Destroy
Packit b099d7
 *
Packit b099d7
 *************************************<->***********************************/
Packit b099d7
static void 
Packit b099d7
ConstraintDestroy(
Packit b099d7
        Widget w )
Packit b099d7
{
Packit b099d7
   XmFrameWidget fw;
Packit b099d7
Packit b099d7
   if (!XtIsRectObj (w)) return;
Packit b099d7
Packit b099d7
   fw = (XmFrameWidget)XtParent(w);
Packit b099d7
Packit b099d7
   if (w == fw->frame.title_area)
Packit b099d7
      fw->frame.title_area = NULL;
Packit b099d7
   else  if (w == fw->frame.work_area)
Packit b099d7
      fw->frame.work_area = NULL;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
Packit b099d7
/************************************************************************
Packit b099d7
 *
Packit b099d7
 *  XmCreateFrame
Packit b099d7
 *	Create an instance of a frame widget and return the widget id.
Packit b099d7
 *
Packit b099d7
 ************************************************************************/
Packit b099d7
Widget 
Packit b099d7
XmCreateFrame(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ArgList arglist,
Packit b099d7
        Cardinal argcount )
Packit b099d7
{
Packit b099d7
   return (XtCreateWidget (name, xmFrameWidgetClass, 
Packit b099d7
                           parent, arglist, argcount));
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget 
Packit b099d7
XmVaCreateFrame(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    register Widget w;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var,name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmFrameWidgetClass,
Packit b099d7
                         parent, False, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}
Packit b099d7
Packit b099d7
Widget
Packit b099d7
XmVaCreateManagedFrame(
Packit b099d7
        Widget parent,
Packit b099d7
        char *name,
Packit b099d7
        ...)
Packit b099d7
{
Packit b099d7
    Widget w = NULL;
Packit b099d7
    va_list var;
Packit b099d7
    int count;
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    count = XmeCountVaListSimple(var);
Packit b099d7
    va_end(var);
Packit b099d7
    
Packit b099d7
    Va_start(var, name);
Packit b099d7
    w = XmeVLCreateWidget(name, 
Packit b099d7
                         xmFrameWidgetClass,
Packit b099d7
                         parent, True, 
Packit b099d7
                         var, count);
Packit b099d7
    va_end(var);   
Packit b099d7
    return w;
Packit b099d7
}