v10i060: wcl -- Widget Creation Library, Part12/11

David E. Smyth david at jpl-devvax.jpl.nasa.gov
Tue Dec 18 09:19:16 AEST 1990


Submitted-by: david at jpl-devvax.jpl.nasa.gov (David E. Smyth)
Posting-number: Volume 10, Issue 60
Archive-name: wcl/part12

# to unbundle, "sh" this file -- DO NOT use csh
#  SHAR archive format.  Archive created Fri Oct 19 09:33:36 PDT 1990
echo x - WcReg.c
sed 's/^X//' > WcReg.c <<'+FUNKY+STUFF+'
X/*
X** Copyright (c) 1990 David E. Smyth
X**
X** This file was derived from work performed by Martin Brunecky at
X** Auto-trol Technology Corporation, Denver, Colorado, under the
X** following copyright:
X**
X*******************************************************************************
X* Copyright 1990 by Auto-trol Technology Corporation, Denver, Colorado.
X*
X*                        All Rights Reserved
X*
X* Permission to use, copy, modify, and distribute this software and its
X* documentation for any purpose and without fee is hereby granted, provided
X* that the above copyright notice appears on all copies and that both the
X* copyright and this permission notice appear in supporting documentation
X* and that the name of Auto-trol not be used in advertising or publicity
X* pertaining to distribution of the software without specific, prior written
X* permission.
X*
X* Auto-trol disclaims all warranties with regard to this software, including
X* all implied warranties of merchantability and fitness, in no event shall
X* Auto-trol be liable for any special, indirect or consequential damages or
X* any damages whatsoever resulting from loss of use, data or profits, whether
X* in an action of contract, negligence or other tortious action, arising out
X* of or in connection with the use or performance of this software.
X*******************************************************************************
X**
X** Redistribution and use in source and binary forms are permitted
X** provided that the above copyright notice and this paragraph are
X** duplicated in all such forms and that any documentation, advertising
X** materials, and other materials related to such distribution and use
X** acknowledge that the software was developed by David E. Smyth.  The
X** name of David E. Smyth may not be used to endorse or promote products
X** derived from this software without specific prior written permission.
X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X**
X*/
X
X/*
X* SCCS_data: @(#)WcReg.c 1.0 ( 19 June 1990 )
X*
X* Subsystem_group:
X*
X*     Widget Creation Library
X*
X* Module_description:
X*
X*     Since (for portability reasons) we can not assume runtime binding,
X*     all widget classes, creation routines (constructors), and callbacks
X*     must be "registered"  by the application BEFORE widget tree creation.
X*
X*     All four of the functions defined in this module load dynamically
X*     allocated and extended arrays of structures.  The size increment
X*     of the arrays starts at a reasonably small size (INCR_REGISTRY,
X*     initially 32), and is doubled in size everytime a given registry is
X*     filled.  This allows registries to be small, yet to not have to be
X*     realloc'd frequently when they grow large.  
X*
X*     The registries are arrays of structs.  In all four cases, the
X*     structs are very similar: they contain a name string which holds the
X*     class, constructor, or callback name as it was registered; a quark
X*     which is based on an all lower case representation of the name, and
X*     class, constructor, or callback specific information.  The name
X*     as registered should be as shown in reference documents and source
X*     code, as it is used for user error messages.
X*
X*     The registries are intended to be used by string-to-whatever converters.
X*
X*     All four registration functions currently check for duplicate
X*     entries, but do no fancy hashing scheme, nor any ties to the
X*     application context.  Assumming a relatively small number of
X*     entries in these regestries, it is assumed that a sequential
X*     search using quarks will be adequate and simple.
X
X* Module_interface_summary: 
X*
X*       WcRegisterClassPtr(
X*	    XtAppContext  app,	    - application context
X*	    String	  name,	    - class ptr name, as in ref manuals
X*	    WidgetClass   class )   - class record pointer
X*
X*       WcRegisterClassName(
X*	    XtAppContext  app,	    - application context
X*	    String	  name,	    - class name, as in ref manuals
X*	    WidgetClass   class )   - class record pointer
X*
X*       WcRegisterConstructor(
X*	    XtAppContext  app,	    - application context
X*	    String	  name,	    - constructor name, as in ref manuals
X*	    (*Widget)()   const )   - constructor function pointer
X*
X*	WcRegisterCallback(
X*	    XtAppContext  app,      - application context
X*           String        name,     - callback name, "nice" capitalization
X*	    void (*func)() )        - pointer to callback function
X*
X*	WcRegisterAction(
X*	    XtAppContext  app,      - application context
X*           String        name,     - action name
X*	    XtActionProc  proc )    - action proc
X
X*	WcAllowDuplicateRegistration   ( int allowed )
X*	WcAllowDuplicateClassPtrReg    ( int allowed )
X*	WcAllowDuplicateClassNameReg   ( int allowed )
X*	WcAllowDuplicateConstructorReg ( int allowed )
X*	WcAllowDuplicateCallbackReg    ( int allowed )
X*
X* Module_history:
X
X*   mm/dd/yy  initials  function  action
X*   --------  --------  --------  ---------------------------------------------
X*   16Jul90   D.Smyth   Added WcAllowDuplicate*()
X*   19Jun90   D.Smyth   Version 1.0 Widget Creation Library
X*   06/08/90  D.Smyth   All Added "name" member for better user msgs.
X*   02/26/90  MarBru    All       Created
X*   02/16/90  MarBru    Create..  Limited creation to composite widgets/objects
X*
X* Design_notes:
X*
X*   For VMS, we could have used LIB$FIND_IMAGE_SYMBOL and use dynamic
X*   (runtime) binding. But since most UNIX systems lack such capability,
X*   we stick to the concept of "registration" routines.
X*
X*******************************************************************************
X*/
X/*
X*******************************************************************************
X* Include_files.
X*******************************************************************************
X*/
X
X/*  -- Widget Creation Includes */
X#include "WcCreate.h"
X#include "WcCreateP.h"
X
X/*
X*******************************************************************************
X* Private_data_definitions.
X*******************************************************************************
X    The following cache/registry of known widget classes, contructors, 
X    and callbacks are initially empty, and are loaded by the application 
X    using "registration" routines.
X*/
X
Xstatic char     msg[MAX_ERRMSG];
X
Xstatic int allowDuplicateClassPtrReg    = FALSE;
Xstatic int allowDuplicateClassNameReg   = FALSE;
Xstatic int allowDuplicateConstructorReg = FALSE;
Xstatic int allowDuplicateCallbackReg    = FALSE;
X
X/*  -- Named class pointer cache, intially empty */
X
Xint         classes_num = 0;
Xint         classes_max = 0;
XClCacheRec *classes_ptr = NULL;
X
X/*  -- Class name cache, intially empty */
X
Xint             cl_nm_num = 0;
Xint             cl_nm_max = 0;
XClNameCacheRec* cl_nm_ptr = NULL;
X
X/*  -- Named object constructor cache, intially empty */
X
Xint          constrs_num = 0;
Xint          constrs_max = 0;
XConCacheRec *constrs_ptr = NULL;
X
X/*  -- Named callback procedures cache, intially empty */
X
Xint         callbacks_num = 0;
Xint         callbacks_max = 0;
XCBCacheRec *callbacks_ptr = NULL;
X
X/*
X*******************************************************************************
X* Private_function_declarations.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Public_function_declarations.
X*******************************************************************************
X*/
X
X/*
X    -- Allow or Disallow Duplicate Registrations
X*******************************************************************************
X    By default, the Widget Creation Library does not allow a
X    string-to-callback, string-to-class, etc bindings to be re-defined.
X    Some applications, most noticably user interface builders, need to be
X    able to change these bindings in order to provide additional
X    flexibility.  Therefore the following functions are provided.  The
X    typical user interface builder will make this single call:
X
X	WcAllowDuplicateRegistration( TRUE );
X
X    which allows class pointers, class names, constructors, and callbacks
X    to be changed during execution.
X*/
X
Xvoid WcAllowDuplicateRegistration( allowed )
X    int allowed;
X{
X    allowDuplicateClassPtrReg = allowed;
X    allowDuplicateClassNameReg = allowed;
X    allowDuplicateConstructorReg = allowed;
X    allowDuplicateCallbackReg = allowed;
X}
Xvoid WcAllowDuplicateClassPtrReg( allowed )
X    int allowed;
X{
X    allowDuplicateClassPtrReg = allowed;
X}
Xvoid WcAllowDuplicateClassNameReg( allowed )
X    int allowed;
X{
X    allowDuplicateClassNameReg = allowed;
X}
Xvoid WcAllowDuplicateConstructorReg( allowed )
X    int allowed;
X{
X    allowDuplicateConstructorReg = allowed;
X}
Xvoid WcAllowDuplicateCallbackReg( allowed )
X    int allowed;
X{
X    allowDuplicateCallbackReg = allowed;
X}
X
X/*
X    -- Register Class Pointer Name
X*******************************************************************************
X    This procedure adds class pointer name to our list of registered
X    classes. Note that the class ptr name is effectively case insensitive
X    as it is being quarkified.  However, one should register the class ptr
X    names using the "standard" capitalization (whatever is in the reference
X    manual for the widget set) as the name as registered is used for error
X    messages.
X
X   The registry is primarily used by CvtStringToClassPtr().
X*/
X
Xvoid WcRegisterClassPtr ( app, name, class )
X    XtAppContext        app;    /* not used (yet), must be present      */
X    char*               name;   /* class ptr name, case insensitive     */
X    WidgetClass         class;  /* Xt object class pointer              */
X{
X    char          *lowerCaseName;
X    XrmQuark       quark;
X    ClCacheRec    *rec;
X    int            i;
X
X    /* Might need to grow cache.  Note that growth increment is exponential:
X    ** if lots of classes, don't need to keep realloc'ing so often.
X    */
X    if (classes_num >= classes_max )
X    {
X        classes_max += (classes_max ? classes_max : INCR_REGISTRY);
X        classes_ptr  = (ClCacheRec*) XtRealloc((char*)classes_ptr,
X                             sizeof(ClCacheRec) * classes_max);
X    }
X
X    /* See if this object has been registered.  Compare quarks.
X    */
X    lowerCaseName = WcLowerCaseCopy( name );
X    quark = XrmStringToQuark ( lowerCaseName );
X    XtFree ( lowerCaseName );
X
X    for (i = 0 ; i < classes_num ; i++ )
X    {
X        if (classes_ptr[i].quark == quark)
X        {
X            /* already registered this class */
X	    if ( allowDuplicateClassPtrReg )
X	    {
X		rec = &classes_ptr[i];		/* overwrite this ClCacheRec */
X		goto found_rec;
X	    }
X            sprintf(msg,
X            "WcRegisterClassPtr (%s) - Failed \n\
X             Problem: Duplicate class registration ignored.",
X             name );
X            XtWarning( msg );
X            return;
X        }
X    }
X
X    rec = &classes_ptr[classes_num++];          /* New ClCacheRec to be filled */
X
Xfound_rec:
X    rec->quark = quark;
X    rec->class = class;
X    rec->name  = XtMalloc( strlen(name) + 1 );
X    strcpy ( rec->name, name );
X}
X
X/*
X    -- Register Class Name
X*******************************************************************************
X    This procedure adds a class name to our list of registered
X    classes. Note that the class name is effectively case insensitive
X    as it is being quarkified.  However, one should register the class
X    names using the "standard" capitalization (whatever is in the reference
X    manual for the widget set) as the name as registered is used for error
X    messages.
X
X   The registry is primarily used by CvtStringToClassName().
X*/
X
Xvoid WcRegisterClassName ( app, name, class )
X    XtAppContext	app;	/* not used (yet), must be present      */
X    char*		name;	/* class name, case insensitive   	*/
X    WidgetClass		class;	/* Xt object class pointer              */
X{
X    char           *lowerCaseName;
X    XrmQuark	    quark;
X    ClNameCacheRec *rec;
X    int		    i;
X
X    /* Might need to grow cache.  Note that growth increment is exponential:
X    ** if lots of classes, don't need to keep realloc'ing so often.
X    */
X    if (cl_nm_num >= cl_nm_max )
X    {
X	cl_nm_max += (cl_nm_max ? cl_nm_max : INCR_REGISTRY);
X	cl_nm_ptr  = (ClNameCacheRec*) XtRealloc((char*)cl_nm_ptr, 
X                             sizeof(ClNameCacheRec) * cl_nm_max);
X    }
X
X    /* See if this object has been registered.  Compare quarks.
X    */
X    lowerCaseName = WcLowerCaseCopy( name );
X    quark = XrmStringToQuark ( lowerCaseName );
X    XtFree ( lowerCaseName );
X
X    for (i = 0 ; i < cl_nm_num ; i++ )
X    {
X	if (cl_nm_ptr[i].quark == quark)
X	{
X	    /* already registered this class */
X	    if ( allowDuplicateClassNameReg )
X	    {
X		rec = &cl_nm_ptr[i];	/* overwrite this ClNameCacheRec */
X		goto found_rec;
X	    }
X	    sprintf(msg, 
X            "WcRegisterClassName (%s) - Failed \n\
X             Problem: Duplicate class registration ignored.",
X             name );
X            XtWarning( msg );
X	    return;
X	}
X    }
X
X    rec = &cl_nm_ptr[cl_nm_num++];	/* New ClNameCacheRec to be filled */
X
Xfound_rec:
X    rec->quark = quark;
X    rec->class = class;
X    rec->name  = XtMalloc( strlen(name) + 1 );
X    strcpy ( rec->name, name );
X}
X
X/*
X    -- Register constructor
X*******************************************************************************
X    This procedure adds constructor procedure/name to our list of registered
X    constructors. Note that the name is effectively case insensitive
X    as it is being quarkified.  However, one should register the 
X    names using the "standard" capitalization (whatever is in the reference
X    manual for the widget set) as the name as registered is used for error
X    messages.
X
X    Note the constructor is a "Motif Style" widget creation routine,
X    commonly called a "confusion function."  
X
X   The registry is primarily used by CvtStringToConstructor().
X*/
X
Xvoid WcRegisterConstructor ( app, name, constructor )
X    XtAppContext app;	        /* not used (yet), must be present      */
X    char*        name;	        /* constructor name, case insensitive   */
X    Widget (*constructor) ();   /* pointer to a widget creation routine */
X{
X    char          *lowerCaseName;
X    XrmQuark       quark;
X    ConCacheRec   *rec;
X    int		   i;
X
X    /* Might need to grow cache.  Note that growth increment is exponential:
X    ** if lots of constructors, don't need to keep realloc'ing so often.
X    */
X    if (constrs_num >= constrs_max )
X    {
X        constrs_max += (constrs_max ? constrs_max : INCR_REGISTRY);
X        constrs_ptr  = (ConCacheRec*) XtRealloc((char*)constrs_ptr,
X                             sizeof(ConCacheRec) * constrs_max);
X    }
X
X    /* See if this object has been registered.  Compare quarks.
X    */
X    lowerCaseName = WcLowerCaseCopy( name );
X    quark = XrmStringToQuark ( lowerCaseName );
X    XtFree ( lowerCaseName );
X
X    for (i = 0 ; i < constrs_num ; i++ )
X    {
X        if (constrs_ptr[i].quark == quark)
X        {
X            /* already registered this class */
X	    if ( allowDuplicateConstructorReg )
X	    {
X		rec = &constrs_ptr[i];		/* overwrite this ConCacheRec */
X		goto found_rec;
X	    }
X            sprintf(msg,
X            "WcRegisterConstructor (%s) - Failed \n\
X             Problem: Duplicate constructor registration ignored.",
X             name );
X            XtWarning( msg );
X            return;
X        }
X    }
X
X    rec = &constrs_ptr[constrs_num++];		/* New ClCacheRec to be filled */
X
Xfound_rec:
X    rec->quark       = quark;
X    rec->constructor = constructor;
X    rec->name        = XtMalloc( strlen(name) + 1 );
X    strcpy ( rec->name, name );
X}
X
X/*
X  -- Register Callbacks
X*******************************************************************************
X    Register callback functions which can then be bound to widget
X    callback lists by the string-to-callback converter 
X    CvtStringToCallback().
X*/
X
Xvoid WcRegisterCallback ( app, name, callback, closure )
X    XtAppContext    app;        /* not used (yet), must be present      */
X    String          name;       /* callback name, case insensitive      */
X    XtCallbackProc  callback;   /* callback function pointer            */
X    caddr_t	    closure;	/* default client data			*/
X{
X    char          *lowerCaseName;
X    XrmQuark       quark;
X    CBCacheRec    *rec;
X    int		   i;
X
X    /* Might need to grow cache.  Note that growth increment is exponential:
X    ** if lots of constructors, don't need to keep realloc'ing so often.
X    */
X    if (callbacks_num >= callbacks_max )
X    {
X        callbacks_max += (callbacks_max ? callbacks_max : INCR_REGISTRY);
X        callbacks_ptr  = (CBCacheRec*) XtRealloc((char*)callbacks_ptr,
X                             sizeof(CBCacheRec) * callbacks_max);
X    }
X
X    /* See if this callback has been registered.  Compare quarks.
X    */
X    lowerCaseName = WcLowerCaseCopy( name );
X    quark = XrmStringToQuark ( lowerCaseName );
X    XtFree ( lowerCaseName );
X
X    for (i = 0 ; i < callbacks_num ; i++ )
X    {
X        if (callbacks_ptr[i].quark == quark)
X        {
X            /* already registered this callback */
X	    if ( allowDuplicateCallbackReg )
X	    {
X		rec = &callbacks_ptr[i];	/* overwrite this CBCacheRec */
X		goto found_rec;
X	    }
X            sprintf(msg,
X            "WcRegisterCallback (%s) - Failed \n\
X             Problem: Duplicate callback registration ignored.",
X             name );
X            XtWarning( msg );
X            return;
X        }
X    }
X
X    rec = &callbacks_ptr[callbacks_num++];   /* New ClCacheRec to be filled */
X
Xfound_rec:
X    rec->quark    = quark;
X    rec->callback = callback;
X    rec->closure  = closure;
X    rec->name     = XtMalloc( strlen(name) + 1 );
X    strcpy ( rec->name, name );
X}
X
X/*
X  -- Register Actions
X*******************************************************************************
X    A simple wrapper around XtAppAddActions().
X    Register action procs which can then be bound to widget
X    actions using standard Xt mechanisms.
X*/
X
Xvoid WcRegisterAction(app, name, proc)
X    XtAppContext app;
X    String       name;
X    XtActionProc proc;
X{
X    static XtActionsRec action_rec[] = {
X        { (String)NULL, (XtActionProc)NULL }
X    };
X
X    action_rec[0].string = name;
X    action_rec[0].proc = proc;
X    XtAppAddActions(app, action_rec, 1);
X}
+FUNKY+STUFF+
echo '-rw-r--r--  1 david       18444 Oct  8 08:32 WcReg.c    (as sent)'
chmod u=rw,g=r,o=r WcReg.c
ls -l WcReg.c
echo x - WcRegXt.c
sed 's/^X//' > WcRegXt.c <<'+FUNKY+STUFF+'
X/*
X** Copyright (c) 1990 David E. Smyth
X**
X** Redistribution and use in source and binary forms are permitted
X** provided that the above copyright notice and this paragraph are
X** duplicated in all such forms and that any documentation, advertising
X** materials, and other materials related to such distribution and use
X** acknowledge that the software was developed by David E. Smyth.  The
X** name of David E. Smyth may not be used to endorse or promote products
X** derived from this software without specific prior written permission.
X** THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
X** WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
X** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
X**
X*/
X
X/*
X* SCCS_data: @(#)WcRegXt.c 1.03 ( 23 July 1990 )
X*
X* Subsystem_group:
X*
X*     Widget Creation Library - Intrinsic Resource Interpreter
X*
X* Module_description:
X*
X*     This module contains registration routine for all Intrinsic
X*     widget constructors and classes.  
X*
X* Module_interface_summary: 
X*
X*     void WcRegisterIntrinsic ( XtAppContext app )
X*
X* Module_history:
X*                                                  
X*   mm/dd/yy  initials  function  action
X*   --------  --------  --------  ---------------------------------------------
X*   07/23/90  D.Smyth   cleaned up function return values.
X*   06/19/90  R.Whitby  all	  create.
X*
X* Design_notes:
X*
X*******************************************************************************
X*/
X/*
X*******************************************************************************
X* Include_files.
X*******************************************************************************
X*/
X
X#include <X11/Intrinsic.h>
X
X#include <X11/Object.h>
X#include <X11/RectObj.h>
X#include <X11/Shell.h>
X#include <X11/Vendor.h>
X
X/* -- Widget constructor routines */
X
XWidget WcCreateApplicationShell	();
XWidget WcCreateOverrideShell	();
XWidget WcCreateShell		();
XWidget WcCreateTopLevelShell	();
XWidget WcCreateTransientShell	();
XWidget WcCreateVendorShell	();
XWidget WcCreateWMShell		();
X
X
Xvoid WcRegisterIntrinsic ( app )
X    XtAppContext app;
X{
X    static int alreadyRegisteredXt = 0;
X
X    if ( alreadyRegisteredXt++ )
X	return;
X
X#define RCN( name, class ) WcRegisterClassName ( app, name, class );
X#define RCP( name, class ) WcRegisterClassPtr  ( app, name, class );
X#define RCR( name, func )  WcRegisterConstructor(app, name, func  );
X
X    /* -- register all Intrinsic widget classes */
X
X    RCN("Object",			objectClass );
X    RCP("objectClass",			objectClass );
X    RCN("RectObj",			rectObjClass );
X    RCP("rectObjClass",			rectObjClass );
X#if defined(MOTIF) && MOTIF > 1 || MOTIF_MINOR > 0
X    RCN("Core",				coreWidgetClass );
X    RCP("coreWidgetClass",		coreWidgetClass );
X#endif
X    RCN("Composite",			compositeWidgetClass );
X    RCP("compositeWidgetClass",		compositeWidgetClass );
X    RCN("Constraint",			constraintWidgetClass );
X    RCP("constraintWidgetClass",	constraintWidgetClass );
X    RCN("ApplicationShell",		applicationShellWidgetClass );
X    RCP("applicationShellWidgetClass",	applicationShellWidgetClass );
X    RCN("OverrideShell",		overrideShellWidgetClass );
X    RCP("overrideShellWidgetClass",	overrideShellWidgetClass );
X    RCN("Shell",			shellWidgetClass );
X    RCP("shellWidgetClass",		shellWidgetClass );
X    RCN("TopLevelShell",		topLevelShellWidgetClass );
X    RCP("topLevelShellWidgetClass",	topLevelShellWidgetClass );
X    RCN("TransientShell",		transientShellWidgetClass );
X    RCP("transientShellWidgetClass",	transientShellWidgetClass );
X    RCN("VendorShell",			vendorShellWidgetClass );
X    RCP("vendorShellWidgetClass",	vendorShellWidgetClass );
X    RCN("WmShell",			wmShellWidgetClass );
X    RCP("wmShellWidgetClass",		wmShellWidgetClass );
X
X    /* -- register all Intrinsic constructors */
X
X    RCR("XtCreateApplicationShell",	WcCreateApplicationShell);
X    RCR("XtCreateOverrideShell",	WcCreateOverrideShell);
X    RCR("XtCreateShell",		WcCreateShell);
X    RCR("XtCreateTopLevelShell",	WcCreateTopLevelShell);
X    RCR("XtCreateTransientShell",	WcCreateTransientShell);
X    RCR("XtCreateWMShell",		WcCreateWMShell);
X    RCR("XtCreateVendorShell",		WcCreateVendorShell);
X
X#undef RCN
X#undef RCP
X#undef RCR
X}
X
X/*
X    -- Create Application Shell
X*******************************************************************************
X    This function creates an application shell widget.
X    
X*/
XWidget WcCreateApplicationShell ( pw, name, args, nargs )
X    Widget	pw;	/* children's parent 				*/
X    String      name;	/* widget name to create 			*/
X    Arg        *args;	/* args for widget				*/
X    Cardinal    nargs;	/* args count					*/
X{
X
X  return XtCreatePopupShell(name, applicationShellWidgetClass, pw, args, nargs);
X}
X
X/*
X    -- Create Override Shell
X*******************************************************************************
X    This function creates an override shell widget.
X    
X*/
XWidget WcCreateOverrideShell ( pw, name, args, nargs )
X    Widget	pw;	/* children's parent 				*/
X    String      name;	/* widget name to create 			*/
X    Arg        *args;	/* args for widget				*/
X    Cardinal    nargs;	/* args count					*/
X{
X  return XtCreatePopupShell(name, overrideShellWidgetClass, pw, args, nargs);
X}
X
X/*
X    -- Create Shell
X*******************************************************************************
X    This function creates a shell widget.
X    
X*/
XWidget WcCreateShell ( pw, name, args, nargs )
X    Widget	pw;	/* children's parent 				*/
X    String      name;	/* widget name to create 			*/
X    Arg        *args;	/* args for widget				*/
X    Cardinal    nargs;	/* args count					*/
X{
X  return XtCreatePopupShell(name, shellWidgetClass, pw, args, nargs);
X}
X
X/*
X    -- Create TopLevel Shell
X*******************************************************************************
X    This function creates a top level shell widget.
X    
X*/
XWidget WcCreateTopLevelShell ( pw, name, args, nargs )
X    Widget	pw;	/* children's parent 				*/
X    String      name;	/* widget name to create 			*/
X    Arg        *args;	/* args for widget				*/
X    Cardinal    nargs;	/* args count					*/
X{
X  return XtCreatePopupShell(name, topLevelShellWidgetClass, pw, args, nargs);
X}
X
X/*
X    -- Create Transient Shell
X*******************************************************************************
X    This function creates an transient shell widget.
X    
X*/
XWidget WcCreateTransientShell ( pw, name, args, nargs )
X    Widget	pw;	/* children's parent 				*/
X    String      name;	/* widget name to create 			*/
X    Arg        *args;	/* args for widget				*/
X    Cardinal    nargs;	/* args count					*/
X{
X  return XtCreatePopupShell(name, transientShellWidgetClass, pw, args, nargs);
X}
X
X/*
X    -- Create Vendor Shell
X*******************************************************************************
X    This function creates a vendor shell widget.
X    
X*/
XWidget WcCreateVendorShell ( pw, name, args, nargs )
X    Widget	pw;	/* children's parent 				*/
X    String      name;	/* widget name to create 			*/
X    Arg        *args;	/* args for widget				*/
X    Cardinal    nargs;	/* args count					*/
X{
X  return XtCreatePopupShell(name, vendorShellWidgetClass, pw, args, nargs);
X}
X
X/*
X    -- Create WM Shell
X*******************************************************************************
X    This function creates an WM shell widget.
X    
X*/
XWidget WcCreateWMShell ( pw, name, args, nargs )
X    Widget	pw;	/* children's parent 				*/
X    String      name;	/* widget name to create 			*/
X    Arg        *args;	/* args for widget				*/
X    Cardinal    nargs;	/* args count					*/
X{
X  return XtCreatePopupShell(name, wmShellWidgetClass, pw, args, nargs);
X}
+FUNKY+STUFF+
echo '-rw-r--r--  1 david        7651 Oct 12 10:27 WcRegXt.c    (as sent)'
chmod u=rw,g=r,o=r WcRegXt.c
ls -l WcRegXt.c
echo x - makefile
sed 's/^X//' > makefile <<'+FUNKY+STUFF+'
X# Assumes that your Imake site.cf defines -DHAVE_MOTIF if you have motif.
X# Otherwise, you will have to add a line which says:
X#	#define HAVE_MOTIF
X#
X# Note how Motif version numbers are defined: Motif 1.1 or Motif 1.1.1
X# is defined:
X#	MOTIF_VER = -DMOTIF=1 -DMOTIF_MINOR=1
X# and when Motif 2.7 comes out, MOTIF_VER gets define as:
X#	MOTIF_VER = -DMOTIF=2 -DMOTIF_MINOR=7
X#
X# If your C compiler does not know how to use prototypes, you may
X# need to add -D_NO_PROTO to the MOTIF_VER macros.  This may be
X# needed because many sites do not put Motif specific defines
X# in their site.cf files used by Imake.
X#
X# Some Table.c and Table_m.c both include Xmu.h.  If you are using
X# Motif 1.0 and you have installed the X11R4 Xmu libraries, then
X# you musr provide the XT_VER macro as shown.  In all other cases,
X# I think that the XT_VER macro is not needed.
X#
X# Also, if you have Motif installed in a non-standard place, set MOTIFDIR to
X# point to it.  The value of MOTIFDIR gets pre-pended to /include and /lib.
X#
X# Motif 1.0 required a special Xt Intrinsics, commonly named libXtm.  If
X# you are building for 1.0, MOTIFLIB should be -lXtm
X
X#
X# typical for Motif 1.0
X#
X      MOTIF_VER = -DMOTIF=1 -DMOTIF_MINOR=0 
X         XT_VER = -DXtSpecificationRelease=4
X       MOTIFDIR = /usr
X        MOTIFXT = -lXtm
X     MOTIFXTLIB = $(MOTIFDIR)/lib/libXtm.a
X
X#
X# typical for Motif 1.1:
X#
X#     MOTIF_VER = -DMOTIF=1 -DMOTIF_MINOR=1 -D_NO_PROTO
X#      MOTIFDIR = /usr
X#       MOTIFXT = -lXt
X#    MOTIFXTLIB = $(MOTIFDIR)/lib/libXt.a
X
X#
X# C compiler and ld definitions - pick and choose, but you CANNOT use
X# prototypes with Motif 1.1!!!  But you can with Motif 1.0.
X#
X  CDEBUGFLAGS = -O
X# CDEBUGFLAGS = -O4
X# CDEBUGFLAGS = -g -DDEBUG
X# CDEBUGFLAGS = -g -Bstatic -DDEBUG
X#
X           CC = cc
X#          CC = gcc -DNOSTDHDRS -fstrength-reduce -fpcc-struct-return -fwritable-strings -traditional
X#          CC = gcc -DFUNCTION_PROTOTYPES -ansi
X
X#
X# Imake related stuff.  
X# You might need to change the MACROFILE, and -DHAVE_MOTIF.
X#
X
X    MACROFILE = sun.cf
X     IRULESRC = /usr/lib/X11/config
X        IMAKE = imake
X    IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) -DHAVE_MOTIF
X ICONFIGFILES = $(IRULESRC)/Imake.tmpl   $(IRULESRC)/Imake.rules \
X                $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
X                $(IRULESRC)/$(MACROFILE)
X#
X# These defines probably never have to change.  What may change
X# is the inclusion of -lXext in the XLIB define, and the place
X# to look for include files (the `-I/usr/include' in CFLAGS).
X#
X         CFLAGS = $(CDEBUGFLAGS) -I. -I/usr/include
X        SYSLIBS = -lm
X  INSTALLLIBDIR = /usr/lib
X  INSTALLINCDIR = /usr/include/Wc
X         XAWLIB = -lXaw
X         XMULIB = -lXmu
X       XTOOLLIB = -lXt
X           XLIB = -lXext -lX11
X#
X# These are aliases for various system commands used by this makefile
X#
X     AR = ar cq
XINSTALL = install
X   MAKE = make
X     MV = mv
X RANLIB = ranlib
X     RM = rm -f
X#
X# Permission flags used at installation time
X#
X     INSTLIBFLAGS = -m 0664
X     INSTINCFLAGS = -m 0444
X     INSTINCFLAGS = -m 0444
X
X          WCLIB = -L. -lWc
X       DEPWCLIB = ./libWc.a
X
X         WCMLIB = -L. -lWcm
X      DEPWCMLIB = ./libWcm.a
X
Xall:: libWc.a Ari App MDathena libWcm.a Mri MDmotif
X
X#
X# Rules for Ari
X#
X
X       ARI_LIBS = $(WCLIB) $(XAWLIB) $(XMULIB) $(XTOOLLIB) $(XLIB)
X       ARI_OBJS = Ari.o AriRegAll.o Table.o
X
XAri:  $(ARI_OBJS)  $(DEPWCLIB)
X	$(RM) $@
X	$(CC) -o $@ $(CDEBUGFLAGS) $(ARI_OBJS) $(ARI_LIBS) $(SYSLIBS)
X
Xclean::
X	$(RM) Ari
X#
X# Rules for App
X#
X
X     APP_OBJS = App.o AriRegAll.o
X
XApp:  $(APP_OBJS)  $(DEPWCLIB)
X	$(RM) $@
X	$(CC) -o $@ $(CDEBUGFLAGS) $(APP_OBJS) $(ARI_LIBS) $(SYSLIBS) 
X
Xclean::
X	$(RM) App
X
X#
X# Rules for MDathena
X#
X
X     MDA_OBJS = MDathena.o AriRegAll.o Table.o
X
XMDathena.o: MD.c
X	$(RM) $@
X	$(CC) -c $(CFLAGS) MD.c -o MDathena.o
X
XMDathena:  $(MDA_OBJS)  $(DEPWCLIB)
X	$(RM) $@
X	$(CC) -o $@ $(CDEBUGFLAGS) $(MDA_OBJS) $(ARI_LIBS) $(SYSLIBS)
X
Xclean::
X	$(RM) MDathena
X
X#
X# Rules for libWc.a
X#
X
X     LIBWC_INCS = WcCreate.h WcCreateP.h
X     LIBWC_OBJS = WcCreate.o WcCallb.o WcConvert.o WcName.o \
X		  WcReg.o WcActions.o WcRegXt.o
X
X.c.o:
X	$(RM) $@
X	$(CC) -c $(CFLAGS) $*.c
X
XlibWc.a:  $(LIBWC_OBJS)
X	$(RM) $@
X	$(AR) $@  $(LIBWC_OBJS)
X	$(RANLIB) $@
X
Xinstall:: libWc.a
X	$(INSTALL) -c $(INSTLIBFLAGS) libWc.a  $(INSTALLLIBDIR)
X	$(RANLIB) $(INSTALLLIBDIR)/libWc.a
X
Xinstall:: $(LIBWC_INCS)
X	@case '${MFLAGS}' in *[i]*) set +e;; esac; \
X	for i in $(LIBWC_INCS); do \
X	(set -x; $(INSTALL) -c $(INSTINCFLAGS) $$i  $(INSTALLINCDIR)); \
X	done
X
Xclean::
X	$(RM) libWc.a
X
X###############################################################################
X# Rules to build Motif clients and Wcl on Motif's Xt
X###############################################################################
X# Note that Motif doesn't provide Xmu, so pick it up from R4
X#
X# Rules for Mri
X#
X
X       MRI_LIBS = $(WCMLIB) $(MOTIFLIB) 
X    MRI_DEPLIBS = $(DEPWCMLIB) $(DEPMOTIFLIB) 
X
X       MOTIFLIB = -L$(MOTIFDIR)/lib -lXm $(MOTIFXT) $(XLIB)
X    DEPMOTIFLIB = $(MOTIFDIR)/lib/libXm.a $(MOTIFXTLIB)
X
X       MRI_OBJS = Mri.o MriRegAll.o Table_m.o
X   MRI_INCLUDES = -I$(MOTIFDIR)/include/Xm -I$(MOTIFDIR)/include
X
X    MRI_DEFINES = $(MOTIF_VER) $(MRI_INCLUDES)
X
XTable_m.o: Table_m.c
X	$(RM) $@
X	$(CC) -c $(XT_VER) $(MRI_DEFINES) $(CFLAGS) $*.c
XMri.o: Mri.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) $*.c
XMriRegAll.o: MriRegAll.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) $*.c
X
XMri:  $(MRI_OBJS)  $(MRI_DEPLIBS)
X	$(RM) $@
X	$(CC) -o $@ $(CDEBUGFLAGS) $(MRI_OBJS) $(MRI_LIBS) $(SYSLIBS)
X
Xclean::
X	$(RM) Mri
X
X
X#
X# Rules for MDmotif
X#
X
XMDM_OBJS = MDmotif.o MriRegAll.o Table_m.o
X
XMDmotif.o: MD.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) MD.c -o MDmotif.o
X
XMDmotif:  $(MDM_OBJS)  $(MRI_DEPLIBS)
X	$(RM) $@
X	$(CC) -o $@ $(CDEBUGFLAGS) $(MDM_OBJS) $(MRI_LIBS) $(SYSLIBS)
X
Xclean::
X	$(RM) MDmotif
X
X#
X# Rules for libWcm.a
X#
X
X    LIBWCM_OBJS = WcmCreate.o WcmCallb.o WcmConvert.o \
X		  WcmName.o WcmReg.o WcmActions.o WcmRegXt.o
X
XWcmCreate.o: WcCreate.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) WcCreate.c  -o WcmCreate.o
XWcmCallb.o: WcCallb.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) WcCallb.c   -o WcmCallb.o
XWcmConvert.o: WcConvert.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) WcConvert.c -o WcmConvert.o
XWcmName.o: WcName.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) WcName.c    -o WcmName.o
XWcmReg.o: WcReg.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) WcReg.c     -o WcmReg.o
XWcmActions.o: WcActions.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) WcActions.c -o WcmActions.o
XWcmRegXt.o: WcRegXt.c
X	$(RM) $@
X	$(CC) -c $(MRI_DEFINES) $(CFLAGS) WcRegXt.c   -o WcmRegXt.o
X
XlibWcm.a:  $(LIBWCM_OBJS)
X	$(RM) $@
X	$(AR) $@  $(LIBWCM_OBJS)
X	$(RANLIB) $@
X
Xinstall:: libWcm.a
X	$(INSTALL) -c $(INSTLIBFLAGS) libWcm.a  $(INSTALLLIBDIR)
X	$(RANLIB) $(INSTALLLIBDIR)/libWcm.a
X
Xclean::
X	$(RM) libWcm.a
X
Xclean::
X	$(RM) *.o core 
X
XMakefile:: makefile_orig
X	- at if [ -f Makefile ]; then \
X	echo "  $(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \
X	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
X	else exit 0; fi
X	$(IMAKE_CMD) -DCURDIR=.
X
Xmakefile_orig: makefile
X	$(MV) makefile makefile_orig
+FUNKY+STUFF+
echo '-rw-rw-r--  1 david        7134 Oct 18 16:36 makefile    (as sent)'
chmod u=rw,g=rw,o=r makefile
ls -l makefile
echo x - patchlevel.h
sed 's/^X//' > patchlevel.h <<'+FUNKY+STUFF+'
X#define PATCHLEVEL 4
+FUNKY+STUFF+
echo '-rw-r--r--  1 david          21 Aug  6 09:45 patchlevel.h    (as sent)'
chmod u=rw,g=r,o=r patchlevel.h
ls -l patchlevel.h
echo x - test
sed 's/^X//' > test <<'+FUNKY+STUFF+'
X# !/bin/csh
X#
X# Execute all of the programs in the Widget Creation Library
X# delivery.
X#
X
Xalias se setenv XENVIRONMENT
X
Xecho This script will execute the programs once at a time.
X
Xif (-e App) then
X    se App1.All
X    App
Xendif
X
Xif (-e Ari) then
X    foreach example (A[0-9][0-9].*)
X	se $example
X	Ari 
X    end
Xendif
X
Xif (-e Mri) then
X    foreach example (M[1-9].*)
X	se $example
X	Mri 
X    end
Xendif
X
Xif (-e MDathena) then
X    se MD
X    MDathena
Xendif
X
Xif (-e MDmotif) then
X    echo	If you are using Xtm instead of X11R4 Xt, then
X    echo	this will core dump when you close a display,
X    echo	and then try to open another display.
X    se MD
X    MDmotif
Xendif
+FUNKY+STUFF+
echo '-rwxr-xr-x  1 david         656 Oct  9 20:48 test*    (as sent)'
chmod u=rwx,g=rx,o=rx test
ls -l test
exit 0

dan
----------------------------------------------------
O'Reilly && Associates   argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
--
dan
----------------------------------------------------
O'Reilly && Associates   argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.



More information about the Comp.sources.x mailing list