# Public Header File

The public header file contains declarations that will be required by any application module that needs to refer to the widget; whether to create an instance of the class, to perform an XtSetValues operation, or to call a public routine implemented by the widget class.

The contents of the Template public header file, `<X11/Xaw/Template.h>`, are:

    ..

    /* Copyright (c) X Consortium 1987, 1988 */

    #ifndef _Template_h
    #define _Template_h

    /****************************************************************
     *
     * Template widget
     *
     ****************************************************************/

    /* Resources:

     Name                Class               RepType     Default Value
     ----                -----               -------     -------------
     background          Background          Pixel       XtDefaultBackground
     border              BorderColor         Pixel       XtDefaultForeground
     borderWidth         BorderWidth         Dimension   1
     destroyCallback     Callback            Pointer     NULL
     height              Height              Dimension   0
     mappedWhenManaged   MappedWhenManaged   Boolean     True
     sensitive           Sensitive           Boolean     True
     width               Width               Dimension   0
     x                   Position            Position    0
     y                   Position            Position    0

    */

    /* define any special resource names here that are not in <X11/StringDefs.h> */

    #define XtNtemplateResource "templateResource"

    #define XtCTemplateResource "TemplateResource"

    /* declare specific TemplateWidget class and instance datatypes */

    typedef struct _TemplateClassRec*	TemplateWidgetClass;
    typedef struct _TemplateRec*	TemplateWidget;

    /* declare the class constant */

    extern WidgetClass templateWidgetClass;

    #endif /* _Template_h */

You will notice that most of this file is documentation. The crucial parts are the last 8 lines where macros for any private resource names and classes are defined and where the widget class datatypes and class record pointer are declared.

For the "WindowWidget", we want 2 drawing colors, a callback list for user input and an `exposeCallback` callback list, and we will declare three convenience procedures, so we need to add

    /* Resources:
    	...
     callback       Callback        Callback        NULL
     drawingColor1  Color           Pixel           XtDefaultForeground
     drawingColor2  Color           Pixel           XtDefaultForeground
     exposeCallback Callback        Callback        NULL
     font           Font            XFontStruct*    XtDefaultFont
    	...
     */

    #define XtNdrawingColor1 "drawingColor1"
    #define XtNdrawingColor2 "drawingColor2"
    #define XtNexposeCallback "exposeCallback"

    extern Pixel WindowColor1( /* Widget */ );
    extern Pixel WindowColor2( /* Widget */ );
    extern Font  WindowFont( /* Widget */ );

Note that we have chosen to call the input callback list by the generic name, `callback`, rather than a specific name. If widgets that define a single user-input action all choose the same resource name then there is greater possibility for an application to switch between widgets of different types.