|
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 |
}
|