In this section I'll describe the various sections in Trivial.c that are important to the subclass. The new sections are printed in a bold typewriter font. Important parts of the new sections are typeset in an italic bold typewriter font.
#include <LTconfig.h>
#include <Xm/XmP.h>
#include <Xm/XmI.h>
#include <Xm/BulletinBP.h>
#include <Xm/PushBP.h>
#include <Xm/PushBGP.h>
#include <Xm/DebugUtil.h>
#include "TrivialP.h"
/*
* Forward Declarations
*/
static void class_initialize();
static void class_part_initialize(WidgetClass class);
static void initialize(Widget request, Widget new,
ArgList args, Cardinal *num_args);
static void destroy(Widget w);
static Boolean set_values(Widget current, Widget request, Widget new,
ArgList args, Cardinal *num_args);
!XmGeoMatrix trivial_matrix_create(Widget _w, Widget _from,
XtWidgetGeometry *_pref);
Boolean trivial_NoGeoRequest(XmGeoMatrix _geoSpec);!
static XmBaseClassExtRec _XmTrivialCoreClassExtRec = {
/* next_extension */ NULL,
/* record_type */ NULLQUARK,
/* version */ XmBaseClassExtVersion,
/* size */ sizeof(XmBaseClassExtRec),
/* initialize_prehook */ NULL,
/* set_values_prehook */ NULL,
/* initialize_posthook */ NULL,
/* set_values_posthook */ NULL,
/* secondary_object_class */ NULL,
/* secondary_object_create */ NULL,
/* get_secondary_resources */ NULL,
/* fast_subclass */ { 0 },
/* get_values_prehook */ NULL,
/* get_values_posthook */ NULL,
/* class_part_init_prehook */ NULL,
/* class_part_init_posthook */ NULL,
/* ext_resources */ NULL,
/* compiled_ext_resources */ NULL,
/* num_ext_resources */ 0,
/* use_sub_resources */ FALSE,
/* widget_navigable */ NULL,
/* focus_change */ NULL,
/* wrapper_data */ NULL
};
static XmManagerClassExtRec _XmTrivialMClassExtRec = {
/* next_extension */ NULL,
/* record_type */ NULLQUARK,
/* version */ XmManagerClassExtVersion,
/* record_size */ sizeof(XmManagerClassExtRec),
/* traversal_children */ NULL /* FIXME */
};
XmTrivialClassRec xmTrivialClassRec = {
/* Core class part */
{
/* superclass */ (WidgetClass)
&xmBulletinBoardClassRec,
/* class_name */ "XmTrivial",
/* widget_size */ sizeof(XmBulletinBoardRec),
/* class_initialize */ class_initialize,
/* class_part_initialize */ class_part_initialize,
/* class_inited */ FALSE,
/* initialize */ initialize,
/* initialize_hook */ NULL,
! /* realize */ XtInheritRealize,!
/* actions */ NULL,
/* num_actions */ 0,
/* resources */ NULL,
/* num_resources */ 0,
/* xrm_class */ NULLQUARK,
/* compress_motion */ TRUE,
/* compress_exposure */ XtExposeCompressMaximal,
/* compress_enterleave */ TRUE,
/* visible_interest */ FALSE,
/* destroy */ destroy,
! /* resize */ XtInheritResize,!
/* expose */ XtInheritExpose,
/* set_values */ set_values,
/* set_values_hook */ NULL,
/* set_values_almost */ XtInheritSetValuesAlmost,
/* get_values_hook */ NULL,
/* accept_focus */ NULL,
/* version */ XtVersion,
/* callback offsets */ NULL,
/* tm_table */ NULL,
! /* query_geometry */ XtInheritQueryGeometry,!
/* display_accelerator */ NULL,
/* extension */ (XtPointer)
&_XmTrivialCoreClassExtRec
},
/* Composite class part */
{
! /* geometry_manager */ XtInheritGeometryManager,
/* change_managed */ XtInheritChangeManaged,!
/* insert_child */ XtInheritInsertChild,
/* delete_child */ XtInheritDeleteChild,
/* extension */ NULL
},
/* Constraint class part */
{
/* subresources */ NULL,
/* subresource_count */ 0,
/* constraint_size */ 0,
/* initialize */ NULL,
/* destroy */ NULL,
/* set_values */ NULL,
/* extension */ NULL
},
/* XmManager class part */
{
/* translations */ XtInheritTranslations,
/* syn_resources */ NULL,
/* num_syn_resources */ 0,
/* syn_constraint_resources */ NULL,
/* num_syn_constraint_resources */ 0,
/* parent_process */ XmInheritParentProcess,
/* extension */ (XtPointer)
&_XmTrivialMClassExtRec
},
/* XmBulletinBoard Area part */
{
/* always_install_accelerators */ False,
! /* geo_matrix_create */ trivial_matrix_create,!
/* focus_moved_proc */ XmInheritFocusMovedProc,
/* extension */ NULL
},
/* XmTrivial Class Part */
{
/* extension */ 0
}
};
WidgetClass xmTrivialWidgetClass = (WidgetClass)&xmTrivialClassRec;
static void
class_initialize()
{
_XmTrivialCoreClassExtRec.record_type = XmQmotif;
}
static void
class_part_initialize(WidgetClass widget_class)
{
}
static void
initialize(Widget request,
Widget new,
ArgList args,
Cardinal *num_args)
{
}
static void
destroy(Widget w)
{
}
static Boolean
set_values(Widget old,
Widget request,
Widget new,
ArgList args,
Cardinal *num_args)
{
Boolean refresh_needed = False;
! BB_InSetValues(new) = True;
/* do any class specific stuff */
BB_InSetValues(new) = False;!
! if (refresh_needed && (XtClass(new) == xmTrivialWidgetClass))
{
_XmBulletinBoardSizeUpdate(new);
return False;
}!
return refresh_needed;
}
!XmGeoMatrix
trivial_matrix_create(Widget _w, Widget _from, XtWidgetGeometry *_pref)
{
XmGeoMatrix geoSpec;
register XmGeoRowLayout layoutPtr;
register XmKidGeometry boxPtr;
Cardinal numKids;
int i, nrows;
Widget child;
numKids = MGR_NumChildren(_w);
°/* compute the number of rows you want here. */
nrows = 1; /* Trivial only has one */°
°geoSpec = _XmGeoMatrixAlloc(nrows, numKids, 0);
geoSpec->composite = (Widget)_w;
geoSpec->instigator = (Widget)_from;
if (_pref)
geoSpec->instig_request = *_pref;
geoSpec->margin_w = BB_MarginWidth(_w) + MGR_ShadowThickness(_w);
geoSpec->margin_h = BB_MarginHeight(_w) + MGR_ShadowThickness(_w);
geoSpec->no_geo_request = trivial_NoGeoRequest;°
layoutPtr = &(geoSpec->layouts->row);
boxPtr = geoSpec->boxes;
°/* row 1 */
layoutPtr->fill_mode = XmGEO_CENTER;
layoutPtr->fit_mode = XmGEO_WRAP;
layoutPtr->even_width = 1;
layoutPtr->even_height = 1;
layoutPtr->space_above = BB_MarginHeight(_w);
for (i = 0; i < numKids; i++) {
child = MGR_Children(_w)[i];
if ((XmIsPushButton(child) || XmIsPushButtonGadget(child)) &&
XtIsManaged(child) && _XmGeoSetupKid(boxPtr, child))
{
boxPtr++;
}
}
layoutPtr++;
/* end marker */
layoutPtr->space_above = 0;
layoutPtr->end = TRUE;°
return(geoSpec);
}
Boolean
trivial_NoGeoRequest(XmGeoMatrix geo)
{
if (BB_InSetValues(geo->composite) &&
XtClass(geo->composite) == xmTrivialWidgetClass)
return TRUE;
return FALSE;
}!
Not bad, only around 350 lines of code. This is about the mininum you can get away with if you write a manager widget anyway. But now let us go straight into the details.