1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00
cde/cde/lib/DtWidget/TitleBox.c
2021-12-24 10:50:27 -07:00

1250 lines
31 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* CDE - Common Desktop Environment
*
* Copyright (c) 1993-2012, The Open Group. All rights reserved.
*
* These libraries and programs are free software; you can
* redistribute them and/or modify them under the terms of the GNU
* Lesser General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* These libraries and programs are distributed in the hope that
* they will be useful, but WITHOUT ANY WARRANTY; without even the
* implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU Lesser General Public License for more
* details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with these libraries and programs; if not, write
* to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
* Floor, Boston, MA 02110-1301 USA
*/
/* $XConsortium: TitleBox.c /main/14 1996/10/14 10:48:11 pascale $
*
* (c) Copyright 1996 Digital Equipment Corporation.
* (c) Copyright 1990,1996 Hewlett-Packard Company.
* (c) Copyright 1996 International Business Machines Corp.
* (c) Copyright 1996 Sun Microsystems, Inc.
* (c) Copyright 1996 Novell, Inc.
* (c) Copyright 1996 FUJITSU LIMITED.
* (c) Copyright 1996 Hitachi.
*/
/**---------------------------------------------------------------------
***
*** file: TitleBox.c
***
*** project: MotifPlus Widgets
***
*** description: Source code for DtTitleBox class.
***
***-------------------------------------------------------------------*/
/*-------------------------------------------------------------
** Include Files
*/
#include <Xm/LabelG.h>
#if RiversVersion == _31
#include <Xm/ManagerP.h>
#include <Xm/GadgetP.h>
#endif /* RiversVersion == _31 */
#include <Xm/DrawP.h>
#include <Xm/XmP.h>
#include <Dt/TitleBoxP.h>
#include <Dt/MacrosP.h>
#include <Dt/DtMsgsP.h>
#include "DtWidgetI.h"
#include <Xm/XmPrivate.h> /* _XmClearShadowType */
/******** Public Function Declarations ********/
extern Widget _DtCreateTitleBox(
Widget parent,
char *name,
ArgList arglist,
Cardinal argcount) ;
extern Widget _DtTitleBoxGetTitleArea(
Widget w) ;
extern Widget _DtTitleBoxGetWorkArea(
Widget w) ;
#define Max(x, y) (((x) > (y)) ? (x) : (y))
/******** End Public Function Declarations ********/
/******** Static Function Declarations ********/
static void ConfigureChildren(
DtTitleBoxWidget manager) ;
static void GetSize(
DtTitleBoxWidget manager,
Dimension ta_w,
Dimension ta_h,
Dimension wa_w,
Dimension wa_h,
Dimension *w,
Dimension *h) ;
static void GetTitleString(
DtTitleBoxWidget manager,
XrmQuark resource,
XtArgVal *value) ;
static void ClassInitialize( void ) ;
static void ClassPartInitialize(
WidgetClass wc) ;
static void Initialize(
DtTitleBoxWidget request,
DtTitleBoxWidget new) ;
static void Destroy(
DtTitleBoxWidget manager) ;
static void Resize(
DtTitleBoxWidget manager) ;
static void Redisplay(
DtTitleBoxWidget manager,
XEvent *event,
Region region) ;
static Boolean SetValues(
DtTitleBoxWidget current,
DtTitleBoxWidget request,
DtTitleBoxWidget new) ;
static XtGeometryResult QueryGeometry(
DtTitleBoxWidget manager,
XtWidgetGeometry *request,
XtWidgetGeometry *reply) ;
static XtGeometryResult GeometryManager(
Widget kid,
XtWidgetGeometry *request,
XtWidgetGeometry *reply) ;
static void ChangeManaged(
DtTitleBoxWidget manager) ;
static void InsertChild(
Widget child) ;
static void ConstraintInitialize(
Widget request,
Widget new) ;
/******** End Static Function Declarations ********/
/*-------------------------------------------------------------
** Forward Declarations
*/
#define UNSPECIFIED_CHAR 255
#define UNSPECIFIED_DIMENSION 9999
#define MARGIN_DEFAULT 10
#define WARN_CHILD_TYPE _DtMsgDialogBox_0000
#define WARN_SHADOW_TYPE _DtMsgIcon_0005
#define WARN_TITLE_POSITION _DtMsgTitleBox_0000
#define WARN_TITLE_ALIGNMENT _DtMsgTitleBox_0001
#define MESSAGE2 _DtMsgTitleBox_0002
#define MESSAGE3 _DtMsgTitleBox_0003
#define MESSAGE4 _DtMsgTitleBox_0004
extern void _DtRegisterNewConverters( void ) ;
/*-------------------------------------------------------------
** Translations and Actions
*/
/*-------------------------------------------------------------
** Resource List
*/
/* Define offset macros.
*/
#define TB_Offset(field) \
XtOffset (DtTitleBoxWidget, title_box.field)
#define TBC_Offset(field) \
XtOffset (DtTitleBoxConstraintPtr, title_box_constraint.field)
static XtResource resources[] =
{
{
XmNshadowThickness,
XmCShadowThickness, XmRShort, sizeof (short),
XtOffset (DtTitleBoxWidget, manager.shadow_thickness),
XmRImmediate, (XtPointer) UNSPECIFIED_DIMENSION
},
{
XmNmarginWidth,
XmCMarginWidth, XmRHorizontalDimension, sizeof (Dimension),
TB_Offset (margin_width),
XmRImmediate, (XtPointer) UNSPECIFIED_DIMENSION
},
{
XmNmarginHeight,
XmCMarginHeight, XmRVerticalDimension, sizeof (Dimension),
TB_Offset (margin_height),
XmRImmediate, (XtPointer) UNSPECIFIED_DIMENSION
},
{
XmNshadowType,
XmCShadowType, XmRShadowType, sizeof (unsigned char),
TB_Offset (shadow_type),
XmRImmediate, (XtPointer) UNSPECIFIED_CHAR
},
{
XmNtitleSpacing,
XmCTitleSpacing, XmRHorizontalDimension, sizeof (Dimension),
TB_Offset (title_spacing),
XmRImmediate, (XtPointer) UNSPECIFIED_DIMENSION
},
{
XmNtitlePosition,
XmCTitlePosition, XmRTitlePosition, sizeof (unsigned char),
TB_Offset (title_position), XmRImmediate, (XtPointer) XmTITLE_TOP
},
{
XmNtitleAlignment,
XmCAlignment, XmRAlignment, sizeof (unsigned char),
TB_Offset (title_alignment),
XmRImmediate, (XtPointer) XmALIGNMENT_BEGINNING
},
{
XmNtitleString,
XmCXmString, XmRXmString, sizeof (XmString),
TB_Offset (title_string),
XmRImmediate, (XtPointer) XmUNSPECIFIED_STRING
},
{
XmNfontList,
XmCFontList, XmRFontList, sizeof (XmFontList),
TB_Offset (font_list), XmRImmediate, (XtPointer) NULL
}
};
/* Synthetic Resources
*/
static XmSyntheticResource syn_resources[] =
{
{
XmNtitleString, sizeof (XmString),
TB_Offset (title_string),
(XmExportProc) GetTitleString,
(XmImportProc) NULL
},
{
XmNmarginWidth, sizeof (Dimension),
TB_Offset (margin_width),
(XmExportProc) XmeFromHorizontalPixels,
(XmImportProc) XmeToHorizontalPixels
},
{
XmNmarginHeight, sizeof (Dimension),
TB_Offset (margin_height),
(XmExportProc) XmeFromVerticalPixels,
(XmImportProc) XmeToVerticalPixels,
}
};
/* Constraint Resources
*/
static XtResource constraints[] =
{
{
XmNchildType,
XmCChildType, XmRChildType, sizeof (unsigned char),
TBC_Offset (child_type), XmRImmediate, (XtPointer) XmWORK_AREA
}
};
/*-------------------------------------------------------------
** Class Record
*/
DtTitleBoxClassRec dtTitleBoxClassRec =
{
/* Core Part
*/
{
(WidgetClass) &xmManagerClassRec, /* superclass */
"DtTitleBox", /* class_name */
sizeof (DtTitleBoxRec), /* widget_size */
ClassInitialize, /* class_initialize */
ClassPartInitialize, /* class_part_initialize*/
False, /* class_inited */
(XtInitProc) Initialize, /* initialize */
NULL, /* initialize_hook */
XtInheritRealize, /* realize */
NULL, /* actions */
0, /* num_actions */
resources, /* resources */
XtNumber (resources), /* num_resources */
NULLQUARK, /* xrm_class */
True, /* compress_motion */
True, /* compress_exposure */
True, /* compress_enterleave */
False, /* visible_interest */
(XtWidgetProc) Destroy, /* destroy */
(XtWidgetProc) Resize, /* resize */
(XtExposeProc) Redisplay, /* expose */
(XtSetValuesFunc) SetValues, /* set_values */
NULL, /* set_values_hook */
XtInheritSetValuesAlmost, /* set_values_almost */
NULL, /* get_values_hook */
NULL, /* accept_focus */
XtVersion, /* version */
NULL, /* callback private */
XtInheritTranslations, /* tm_table */
XtInheritQueryGeometry, /* query_geometry */
NULL, /* display_accelerator */
NULL, /* extension */
},
/* Composite Part
*/
{
(XtGeometryHandler) GeometryManager,/* geometry_manager */
(XtWidgetProc) ChangeManaged, /* change_managed */
(XtWidgetProc) InsertChild, /* insert_child */
XtInheritDeleteChild, /* delete_child */
NULL, /* extension */
},
/* Composite Part
*/
{
constraints, /* constraint_resources */
XtNumber (constraints), /* num_constraint_resources */
sizeof (DtTitleBoxConstraintRec), /* constraint_record */
(XtInitProc) ConstraintInitialize, /* constraint_initialize */
NULL, /* constraint_destroy */
NULL, /* constraint_set_values */
NULL, /* extension */
},
/* XmManager Part
*/
{
XtInheritTranslations, /* default_translations */
syn_resources, /* syn_resources */
XtNumber (syn_resources), /* num_syn_resources */
NULL, /* syn_cont_resources */
0, /* num_syn_cont_resources */
XmInheritParentProcess, /* parent_process */
NULL, /* extension */
},
/* DtTitleBox Part
*/
{
NULL, /* extension */
}
};
WidgetClass dtTitleBoxWidgetClass = (WidgetClass) &dtTitleBoxClassRec;
/*-------------------------------------------------------------
** Private Procs
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
** ConfigureChildren
** Set positions and sizes of title and work area.
*/
static void
ConfigureChildren(
DtTitleBoxWidget manager )
{
Widget title_area = M_TitleArea (manager),
work_area = M_WorkArea (manager);
Position ta_x = 0, ta_y = 0, wa_x = 0, wa_y = 0;
Dimension ta_w = 0, ta_h = 0, ta_bw = 0,
wa_w = 0, wa_h = 0, wa_bw = 0,
w = M_Width (manager),
h = M_Height (manager),
s_t = M_ShadowThickness (manager),
m_w = M_MarginWidth (manager),
m_h = M_MarginHeight (manager),
ta_sp = M_TitleSpacing (manager);
Boolean title_top;
unsigned char align = M_TitleAlignment (manager);
XtWidgetGeometry ta_reply;
title_top = (M_TitlePosition (manager) == XmTITLE_TOP) ? True : False;
/* Set position and size of title area.
*/
if (title_area)
{
XtQueryGeometry (title_area, NULL, &ta_reply);
ta_w = ta_reply.width;
ta_h = ta_reply.height;
if (ta_w + 2U * ta_sp > (M_Width (manager) - 2U * ta_sp))
ta_w = M_Width (manager) - 2 * ta_sp;
if (ta_w == 0)
ta_w = 10;
if (ta_h == 0)
ta_h = 10;
if (align == XmALIGNMENT_BEGINNING)
ta_x = ta_sp;
else if (align == XmALIGNMENT_END)
ta_x = w - ta_sp - ta_w;
else
ta_x = (w - ta_w) / 2U;
ta_y = (title_top) ? 0 : h - ta_h;
ta_bw = P_BorderWidth (title_area);
XmeConfigureObject (title_area, ta_x, ta_y, ta_w, ta_h, ta_bw);
}
/* Set position and size of work area.
*/
if (work_area)
{
wa_x = m_w + s_t;
wa_y = (title_top) ? Max (s_t, ta_h) + m_h : s_t + m_h;
wa_w = w - 2 * (m_w + s_t);
if (wa_w == 0)
wa_w = 10;
wa_h = h - Max (s_t, ta_h) - s_t - 2 * m_h;
if (wa_h == 0)
wa_h = 10;
wa_bw = P_BorderWidth (work_area);
XmeConfigureObject (work_area,
wa_x, wa_y, wa_w, wa_h, wa_bw);
}
}
/*-------------------------------------------------------------------------
** GetSize
** Calculate desired size based on children.
*/
static void
GetSize(
DtTitleBoxWidget manager,
Dimension ta_w,
Dimension ta_h,
Dimension wa_w,
Dimension wa_h,
Dimension *w,
Dimension *h )
{
Widget title_area = M_TitleArea (manager),
work_area = M_WorkArea (manager);
XtWidgetGeometry ta_reply, wa_reply;
Dimension s_t = M_ShadowThickness (manager),
m_w = M_MarginWidth (manager),
m_h = M_MarginHeight (manager),
ta_sp = M_TitleSpacing (manager);
/* Optimize title area change if possible.
*/
if (work_area && (wa_w == 0) && (wa_h == 0))
{
if ((ta_w != 0) && (ta_h == 0))
{
if ((M_Width (manager) >=
M_Width (work_area) + (2U * ta_sp)) &&
(M_Height (manager) >= Max (ta_h, s_t) +
M_Height (work_area) + s_t + (2U * m_h)))
{
wa_w = M_Width (work_area);
wa_h = M_Height (work_area);
}
}
if ((wa_w == 0) && (wa_h == 0))
{
XtQueryGeometry (work_area, NULL, &wa_reply);
wa_w = wa_reply.width;
wa_h = wa_reply.height;
}
}
if (title_area && (ta_w == 0) && (ta_h == 0))
{
XtQueryGeometry (title_area, NULL, &ta_reply);
ta_w = ta_reply.width;
ta_h = ta_reply.height;
}
*w = Max (wa_w + (2U * (m_w + s_t)), ta_w + (2U * ta_sp));
if (*w == 0)
*w = 10;
*h = Max (s_t, ta_h) + wa_h + (2 * m_h) + s_t;
if (*h == 0)
*h = 10;
}
/*-------------------------------------------------------------
** GetTitleString
** Get string from title label.
*/
static void
GetTitleString(
DtTitleBoxWidget manager,
XrmQuark resource,
XtArgVal *value )
{
Arg al[10]; /* arg list */
int ac; /* arg count */
Widget title_area = M_TitleArea (manager);
XmString string = NULL;
if (title_area)
{
ac = 0;
XtSetArg (al[ac], XmNlabelString, &string); ac++;
XtGetValues (title_area, al, ac);
}
*value = (XtArgVal) string;
}
/*-------------------------------------------------------------
** Action Procs
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
** Core Procs
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------------------
** ClassInitialize
** Initialize widget class.
*/
static void
ClassInitialize( void )
{
_DtRegisterNewConverters ();
}
/*-------------------------------------------------------------------------
** ClassPartInitialize
** Initialize widget class data.
*/
static void
ClassPartInitialize(
WidgetClass wc )
{
}
/*-------------------------------------------------------------
** Initialize
** Initialize a new widget instance.
*/
static void
Initialize(
DtTitleBoxWidget request,
DtTitleBoxWidget new )
{
Arg al[10]; /* arg list */
int ac; /* arg count */
Widget title = NULL;
XmString title_string = NULL;
/* Check for unspecified dimensions.
*/
if (M_MarginWidth (request) == UNSPECIFIED_DIMENSION)
M_MarginWidth (new) = MARGIN_DEFAULT;
if (M_MarginHeight (request) == UNSPECIFIED_DIMENSION)
M_MarginHeight (new) = MARGIN_DEFAULT;
if (M_TitleSpacing (request) == UNSPECIFIED_DIMENSION)
M_TitleSpacing (new) = UNSPECIFIED_DIMENSION;
if (M_ShadowThickness (new) == UNSPECIFIED_DIMENSION)
{
if (XtIsShell (XtParent (new)))
M_ShadowThickness (new) = 1;
else
M_ShadowThickness (new) = 2;
}
/* Validate shadow type.
*/
if (M_ShadowType (new) == UNSPECIFIED_CHAR)
{
if (XtIsShell (XtParent (new)))
M_ShadowType (new) = XmSHADOW_OUT;
else
M_ShadowType (new) = XmSHADOW_ETCHED_IN;
}
else if (M_ShadowType (new) != XmSHADOW_IN &&
M_ShadowType (new) != XmSHADOW_OUT &&
M_ShadowType (new) != XmSHADOW_ETCHED_IN &&
M_ShadowType (new) != XmSHADOW_ETCHED_OUT)
{
XmeWarning ((Widget)new, WARN_SHADOW_TYPE);
}
/* Validate title position.
*/
if (M_TitlePosition (new) != XmTITLE_TOP &&
M_TitlePosition (new) != XmTITLE_BOTTOM)
{
XmeWarning ((Widget)new, WARN_TITLE_POSITION);
}
/* Validate title alignment.
*/
if (M_TitleAlignment (new) != XmALIGNMENT_BEGINNING &&
M_TitleAlignment (new) != XmALIGNMENT_CENTER &&
M_TitleAlignment (new) != XmALIGNMENT_END)
{
XmeWarning ((Widget)new, WARN_TITLE_ALIGNMENT);
}
/* Check width and height.
*/
if (M_Width (new) == 0)
{
M_Width (new) = 2 * (M_ShadowThickness (new) +
M_MarginWidth (new));
if (M_Width (new) == 0)
M_Width (new) = 10;
}
if (M_Height (new) == 0)
{
M_Height (new) = 2 * (M_ShadowThickness (new) +
M_MarginHeight (new));
if (M_Height (new) == 0)
M_Height (new) = 10;
}
M_OldWidth (new) = M_Width (new);
M_OldHeight (new) = M_Height (new);
M_OldShadowThickness (new) = M_ShadowThickness (new);
M_WorkArea (new) = NULL;
/* Create title_area unless title explicitly set to null;
* use name if unspecified.
*/
if (! M_TitleString (new))
{
M_TitleArea (new) = NULL;
return;
}
if (M_TitleString (new) == XmUNSPECIFIED_STRING && M_Name (new))
{
M_TitleString (new) = XmStringCreateLocalized(M_Name (new));
title_string = M_TitleString (new);
}
ac = 0;
XtSetArg (al[ac], XmNchildType, XmTITLE_AREA); ac++;
XtSetArg (al[ac], XmNmarginWidth, 2); ac++;
XtSetArg (al[ac], XmNmarginHeight, 0); ac++;
XtSetArg (al[ac], XmNshadowThickness, 0); ac++;
XtSetArg (al[ac], XmNhighlightThickness, 0); ac++;
XtSetArg (al[ac], XmNlabelString, M_TitleString (new)); ac++;
if (M_FontList (new))
{
XtSetArg (al[ac], XmNfontList, M_FontList (new));
ac++;
}
title = XmCreateLabelGadget ((Widget)new, "title", al, ac);
M_TitleArea (new) = title;
XtManageChild (title);
if (M_TitleSpacing (new) == UNSPECIFIED_DIMENSION)
M_TitleSpacing (new) =
Max (P_Height (title)/2U, M_ShadowThickness (new));
M_TitleString (new) = XmUNSPECIFIED_STRING;
M_FontList (new) = NULL;
if (title_string != NULL)
XmStringFree (title_string);
}
/*-------------------------------------------------------------
** Destroy
** Release resources allocated for widget instance.
*/
static void
Destroy(
DtTitleBoxWidget manager )
{
/* Superclass does all the work so far.
*/
}
/*-------------------------------------------------------------
** Resize
** Update size of children.
*/
static void
Resize(
DtTitleBoxWidget manager )
{
Widget title_area = M_TitleArea (manager);
Dimension s_t = M_OldShadowThickness (manager),
w = M_OldWidth (manager),
h = M_OldHeight (manager);
Position y;
/* Clear shadow and save shadow data.
*/
if (XtIsRealized ((Widget)manager))
{
_XmClearShadowType ((Widget)manager, w, h, s_t, 0);
if ((M_TitlePosition (manager) == XmTITLE_BOTTOM) &&
(M_Height (manager) > h))
{
y = h - P_Height (title_area);
XClearArea (XtDisplay (manager), XtWindow (manager),
0, y, M_Width (manager),
M_Height (manager) - y, False);
}
}
M_OldWidth (manager) = M_Width (manager);
M_OldHeight (manager) = M_Height (manager);
M_OldShadowThickness (manager) = M_ShadowThickness (manager);
ConfigureChildren (manager);
/* Draw shadow and title.
*/
if (XtIsRealized ((Widget)manager))
Redisplay (manager, NULL, NULL);
}
/*-------------------------------------------------------------
** Redisplay
** Redisplay widget.
*/
static void
Redisplay(
DtTitleBoxWidget manager,
XEvent *event,
Region region )
{
Widget title_area = M_TitleArea (manager),
work_area = M_WorkArea (manager);
Position title_x = M_X (title_area),
title_y = M_Y (title_area);
Dimension title_width = M_Width (title_area),
title_height = M_Height (title_area);
Display * d = XtDisplay (manager);
Dimension w = M_Width (manager),
h = M_Height (manager),
s_t = M_ShadowThickness (manager);
Position x = 0,
y = title_height / 2 - s_t / 2;
/* Redisplay work area.
*/
if (XmIsGadget (work_area) && XtIsManaged (work_area))
{
XtExposeProc expose;
_DtProcessLock();
expose = XtCoreProc(work_area, expose);
_DtProcessUnlock();
(*expose) (work_area, event, region);
}
/* Draw shadow.
*/
if (M_ShadowThickness (manager) > 0)
{
h -= y;
if (M_TitlePosition (manager) == XmTITLE_BOTTOM)
y = 0;
XmeDrawShadows(d, XtWindow(manager),
M_TopShadowGC(manager),
M_BottomShadowGC(manager),
x, y, w, h, s_t, M_ShadowType(manager));
}
/* Redisplay title area.
*/
if (title_area && XtIsManaged (title_area))
{
XClearArea (d, XtWindow (manager), title_x, title_y,
title_width, title_height, False);
if (XmIsGadget (title_area))
{
XtExposeProc expose;
_DtProcessLock();
expose = XtCoreProc(title_area, expose);
_DtProcessUnlock();
(*expose) (title_area, event, region);
}
}
}
/*-------------------------------------------------------------
** SetValues
** Handle changes in resource data.
*/
static Boolean
SetValues(
DtTitleBoxWidget current,
DtTitleBoxWidget request,
DtTitleBoxWidget new )
{
Widget title = M_TitleArea (new);
Boolean redisplay_flag = False,
new_title = False,
new_font = False;
Arg al[10]; /* arg list */
int ac; /* arg count */
/* Validate title position.
*/
if (M_TitlePosition (new) != M_TitlePosition (current) &&
M_TitlePosition (new) != XmTITLE_TOP &&
M_TitlePosition (new) != XmTITLE_BOTTOM)
{
XmeWarning ((Widget)new, WARN_TITLE_POSITION);
M_TitlePosition (new) = M_TitlePosition (current);
}
/* Validate title alignment.
*/
if (M_TitleAlignment (new) != M_TitleAlignment (current) &&
M_TitleAlignment (new) != XmALIGNMENT_BEGINNING &&
M_TitleAlignment (new) != XmALIGNMENT_CENTER &&
M_TitleAlignment (new) != XmALIGNMENT_END)
{
XmeWarning ((Widget)new, WARN_TITLE_ALIGNMENT);
M_TitleAlignment (new) = M_TitleAlignment (current);
}
/* Validate shadow type.
*/
if (M_ShadowType (new) != M_ShadowThickness (current) &&
M_ShadowType (new) != XmSHADOW_IN &&
M_ShadowType (new) != XmSHADOW_OUT &&
M_ShadowType (new) != XmSHADOW_ETCHED_IN &&
M_ShadowType (new) != XmSHADOW_ETCHED_OUT)
{
XmeWarning ((Widget)new, WARN_SHADOW_TYPE);
M_ShadowType (new) = M_ShadowThickness (current);
}
/* Check for redisplay; query and update kids if no resize.
*/
if (M_MarginWidth (new) != M_MarginWidth (current) ||
M_MarginHeight (new) != M_MarginHeight (current) ||
M_ShadowThickness (new) != M_ShadowThickness (current))
{
redisplay_flag = True;
if (M_Width (new) == M_Width (current) &&
M_Height (new) == M_Height (current))
{
GetSize (new, 0, 0, 0, 0,
&(M_Width (new)), &(M_Height (new)));
ConfigureChildren (new);
}
}
else if (M_TitleSpacing (new) != M_TitleSpacing (current) ||
M_TitlePosition (new) != M_TitlePosition (current) ||
M_TitleAlignment (new) != M_TitleAlignment (current))
{
redisplay_flag = True;
ConfigureChildren (new);
}
else if (M_ShadowType (new) != M_ShadowThickness (current))
{
redisplay_flag = True;
}
/* Update title if string or font changed.
*/
ac = 0;
if (M_TitleString (current) != M_TitleString (new))
{
new_title = True;
XtSetArg (al[ac], XmNlabelString, M_TitleString (new)); ac++;
}
if (M_FontList (current) != M_FontList (new))
{
new_font = True;
XtSetArg (al[ac], XmNfontList, M_FontList (new));
ac++;
}
if (ac && title)
{
XtSetValues (title, al, ac);
if (new_title)
M_TitleString (new) = XmUNSPECIFIED_STRING;
if (new_font)
M_FontList (new) = NULL;
redisplay_flag = True;
}
return (redisplay_flag);
}
/*-------------------------------------------------------------
** QueryGeometry
** Handle query geometry request.
*/
static XtGeometryResult
QueryGeometry(
DtTitleBoxWidget manager,
XtWidgetGeometry *request,
XtWidgetGeometry *reply )
{
Dimension w = M_Width (manager),
h = M_Height (manager),
new_w = 0,
new_h = 0;
Boolean width_req = request->request_mode & CWWidth,
height_req = request->request_mode & CWHeight;
/* Compute preferred size if preferred width or height requested.
*/
if (width_req || height_req)
GetSize (manager, 0, 0, 0, 0, &new_w, &new_h);
/* Load reply.
*/
reply->request_mode = request->request_mode;
reply->x = request->x;
reply->y = request->y;
reply->width = (width_req) ? new_w : request->width;
reply->height = (height_req) ? new_h : request->height;
reply->border_width = request->border_width;
/* If no change return no; otherwise yes.
*/
if ((!width_req || (width_req && w == new_w)) &&
(!height_req || (height_req && h == new_h)))
return (XtGeometryNo);
else
return (XtGeometryYes);
}
/*-------------------------------------------------------------
** Composite Procs
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
** GeometryManager
** Handle geometry request from title area or work area.
*/
static XtGeometryResult
GeometryManager(
Widget kid,
XtWidgetGeometry *request,
XtWidgetGeometry *reply )
{
DtTitleBoxWidget manager = (DtTitleBoxWidget) XtParent (kid);
Widget title_area = M_TitleArea (manager);
Dimension ta_w = 0, ta_h = 0, ta_bw = 0,
wa_w = 0, wa_h = 0,
w = M_Width (manager),
h = M_Height (manager);
Boolean query_only = request->request_mode & XtCWQueryOnly,
x_req = request->request_mode & CWX,
y_req = request->request_mode & CWY,
width_req = request->request_mode & CWWidth,
height_req = request->request_mode & CWHeight,
bw_req = request->request_mode & CWBorderWidth,
almost = False;
XtGeometryResult result = XtGeometryYes, parent_result;
XtWidgetGeometry parent_req, parent_reply;
/* Check for width, height, and borderwidth requests.
*/
if (!width_req && !height_req)
{
if (x_req || y_req)
return (XtGeometryNo);
else
return (XtGeometryYes);
}
else
{
if (x_req || y_req)
almost = True;
}
/* Compute desired size.
*/
if (kid == title_area)
{
ta_w = (width_req) ? request->width : P_Width (kid);
ta_h = (height_req) ? request->height : P_Height (kid);
ta_bw = (bw_req) ? request->border_width : P_BorderWidth (kid);
}
else
{
wa_w = (width_req) ? request->width : P_Width (kid);
wa_h = (height_req) ? request->height : P_Height (kid);
}
GetSize (manager, ta_w, ta_h, wa_w, wa_h, &w, &h);
/* Request change from parent if necessary.
*/
if (w != M_Width (manager) || h != M_Height (manager))
{
parent_req.request_mode = CWWidth | CWHeight;
parent_req.width = w;
parent_req.height = h;
if (almost || query_only)
parent_req.request_mode |= XtCWQueryOnly;
parent_result =
XtMakeGeometryRequest ((Widget)manager, &parent_req,
&parent_reply);
if (kid == (Widget) title_area)
parent_result = XtGeometryYes;
}
else
parent_result = XtGeometryYes;
/* Reply to kid based on reply from parent.
*/
switch ((int) parent_result)
{
case XtGeometryYes:
if (query_only)
result = XtGeometryYes;
else if (!almost)
{
XtWidgetProc resize;
if (kid == title_area)
XmeConfigureObject (title_area,
title_area->core.x,
title_area->core.y,
ta_w, ta_h, ta_bw);
_DtProcessLock();
resize = XtCoreProc(XtParent(kid), resize);
_DtProcessUnlock();
(*resize) (XtParent (kid));
result = XtGeometryDone;
}
else
{
result = XtGeometryNo;
}
break;
case XtGeometryAlmost:
case XtGeometryNo:
result = XtGeometryNo;
break;
}
return (result);
}
/*-------------------------------------------------------------
** ChangeManaged
** Handle change in set of managed children.
*/
static void
ChangeManaged(
DtTitleBoxWidget manager )
{
Dimension w = M_Width (manager),
h = M_Height (manager);
/* Compute desired size.
*/
GetSize (manager, 0, 0, 0, 0, &w, &h);
/* Try to change size to fit children
*/
if (w != M_Width (manager) || h != M_Height (manager))
{
switch (XtMakeResizeRequest ((Widget) manager, w, h, &w, &h))
{
case XtGeometryAlmost:
XtMakeResizeRequest ((Widget) manager, w, h,
NULL, NULL);
case XtGeometryYes:
case XtGeometryNo:
default:
break;
}
}
/* Set positions and sizes of children.
*/
ConfigureChildren (manager);
XmeNavigChangeManaged ((Widget)manager);
}
/*-------------------------------------------------------------
** InsertChild
** Add a child.
*/
static void
InsertChild(
Widget child )
{
DtTitleBoxConstraint constraint = (DtTitleBoxConstraint)
M_TitleBoxConstraint (child);
DtTitleBoxWidget w;
XmManagerWidgetClass mc = (XmManagerWidgetClass)
xmManagerWidgetClass;
XtWidgetProc insert_child;
_DtProcessLock();
insert_child = mc->composite_class.insert_child;
_DtProcessUnlock();
(* insert_child) (child);
w = (DtTitleBoxWidget) XtParent (child);
if (constraint->child_type == XmWORK_AREA)
{
if (! M_WorkArea (w))
{
M_WorkArea (w) = child;
}
}
else if (constraint->child_type == XmTITLE_AREA)
{
if (! M_TitleArea (w))
{
M_TitleArea (w) = child;
}
}
}
/*-------------------------------------------------------------
** Constraint Procs
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
** ConstraintInitialize
** Add a child.
*/
static void
ConstraintInitialize(
Widget request,
Widget new )
{
DtTitleBoxWidget manager = (DtTitleBoxWidget) XtParent (new);
DtTitleBoxConstraint constraint = M_TitleBoxConstraint (new);
/* Validate child type.
*/
if (constraint->child_type != XmWORK_AREA &&
constraint->child_type != XmTITLE_AREA)
{
XmeWarning (new, WARN_CHILD_TYPE);
if (! M_WorkArea (manager))
{
constraint->child_type = XmWORK_AREA;
}
else if (! M_TitleArea (manager))
{
constraint->child_type = XmTITLE_AREA;
}
}
}
/*-------------------------------------------------------------
** Manager Procs
**-------------------------------------------------------------
*/
/* All inherited from superclass.
*/
/*-------------------------------------------------------------
** Public Entry Points
**-------------------------------------------------------------
*/
/*-------------------------------------------------------------
** _DtCreateTitleBox
** Create a new DtTitleBox instance.
**-------------------------------------------------------------
*/
Widget
_DtCreateTitleBox(
Widget parent,
char *name,
ArgList arglist,
Cardinal argcount )
{
return (XtCreateWidget (name, dtTitleBoxWidgetClass,
parent, arglist, argcount));
}
/*-------------------------------------------------------------
** _DtTitleBoxGetTitleArea
** Return TitleBox title area;
**-------------------------------------------------------------
*/
Widget
_DtTitleBoxGetTitleArea(
Widget w )
{
DtTitleBoxWidget mgr = (DtTitleBoxWidget) w;
Widget rtn_w = M_TitleArea (mgr);
return (rtn_w);
}
/*-------------------------------------------------------------
** _DtTitleBoxGetWorkArea
** Return TitleBox work area;
**-------------------------------------------------------------
*/
Widget
_DtTitleBoxGetWorkArea(
Widget w )
{
DtTitleBoxWidget mgr = (DtTitleBoxWidget) w;
Widget rtn_w = M_WorkArea (mgr);
return (rtn_w);
}