/* * 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 #if RiversVersion == _31 #include #include #endif /* RiversVersion == _31 */ #include #include #include
#include
#include
#include "DtWidgetI.h" #include /* _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); }