v13i065: xrainbow, Part03/05

Dave Nedde daven at maxine.WPI.EDU
Fri Jun 28 11:04:35 AEST 1991


Submitted-by: daven at maxine.WPI.EDU (Dave Nedde)
Posting-number: Volume 13, Issue 65
Archive-name: xrainbow/part03

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 5)."
# Contents:  xrainbow/Wc1_05/Wc/WcConvert.c
#   xrainbow/Wc1_05/Wc/WcCreate.c xrainbow/Wc1_05/Wc/WcCreate.h
#   xrainbow/Wc1_05/Wc/WcCreateP.h
#   xrainbow/include/X11/Xaw_d/DrawingA.h
# Wrapped by daven at ash on Mon Jun  3 12:33:23 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xrainbow/Wc1_05/Wc/WcConvert.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcConvert.c'\"
else
echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcConvert.c'\" \(21715 characters\)
sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcConvert.c' <<'END_OF_FILE'
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: @(#)WcConvert.c 1.1 ( 19 Nov 90 )
X*
X* Subsystem_group:
X*
X*     Widget Creation Library
X*
X* Module_description:
X*
X*     This module contains Xt converter functions which convert strings,
X*     as found in the Xrm database, into useful types.  
X*
X*     It also contains the routine which registers all Wc converters.
X*
X*     The CvtStringToWidget converter takes a pathname which starts 
X*     from the application shell an proceeds to a specific widget.  The
X*     widget must already have been created.   Note that this converter
X*     needs to be used INSTEAD of the XmuCvtStringToWidget which gets
X*     registered by the Athena widgets.  The Xmu converter is not so
X*     user friendly.  This means this file also declares an external
X*     function XmuCvtStringToWidget() which is really CvtStringToWidget,
X*     and this needs to be linked before Xmu.
X*
X*     The CvtStringToCallback converter parses the resource string in 
X*     the format:
X*
X*       ...path:   name[(args)][,name[(args)]]...
X*
X*     where:  name:   specifies the registered callback function name
X*             args:   specifies the string passed to a callback as
X*		      "client data".
X*
X*     Multiple callbacks can be specified for a single callback list
X*     resource.  Any callbacks must be "registered" by the application
X*     prior converter invocation (.i.e.prior widget creation).
X*     If no "args" string is provided, the default "client data" 
X*     specified at callback registration are used.
X*
X*     The CvtStringToConstructor converter searches the Constructor
X*     cache for a registered constructor.  
X*
X*     The CvtStringToClass converter searches the Class cache for a 
X*     registered object (widget) class pointer name.
X*
X*     The CvtStringToClassName converter searches the ClassName cache
X*     for a registered object (widget) class name.
X
X*
X* Module_interface_summary: 
X*
X*     Resource converter is invoked indirectly by the toolkit. The
X*     converter is added to the toolkit by widgets calling
X*     WcAddConverters() in the Wc intialization code.
X*
X* Module_history:
X*                                                  
X*   mm/dd/yy  initials  function  action
X*   --------  --------  --------  ---------------------------------------------
X*   06/08/90  D.Smyth   Class, ClassName, and Constructor converters.
X*   05/24/90  D.Smyth   WcAddConverters created from something similar
X*   04/03/90  MarBru    CvtStr..  Fixed argument termination with a NUL char
X*   02/26/90  MarBru    All       Created
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*   One time, I considered applying conversion to callback argument, which
X*   would take the burden of conversion from the callback code (runtime)
X*   to the callback  conversion (one time initialization). The problem is
X*   that some conversions are widget context specific (color to pixel needs
X*   display connection), and at the time of callback conversion I do not
X*   have a widget. I could require the widget argument, but this would kill
X*   caching of the conversion result.
X*
X*   The sequential search of the callback cache is far from optimal. I should
X*   use binary search, or the R4 conversion cache.  I can't use the R4 cache
X*   until Motif 1.1 is released which will (supposedly) run on R4 Intrinsics.
X*   
X*******************************************************************************
X*/
X/*
X*******************************************************************************
X* Include_files.
X*******************************************************************************
X*/
X
X#include <ctype.h>	/* isupper() and tolower macros */
X#include <stdio.h>
X
X/*  -- X Window System includes */
X#include <X11/Intrinsic.h>
X#include <X11/StringDefs.h> 
X
X/*  -- Widget Creation Library includes */
X#include "WcCreate.h"
X#include "WcCreateP.h"
X
X/*
X*******************************************************************************
X* Private_constant_declarations.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Private_type_declarations.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Private_macro_definitions.
X*******************************************************************************
X*/
X
X#define done( type, value ) 			\
X{						\
X    if ( toVal->addr != NULL )			\
X    {						\
X	if ( toVal->size < sizeof( type ) )	\
X	{					\
X	    toVal->size = sizeof( type );	\
X	    return;				\
X	}					\
X	*(type*)(toVal->addr) = (value);	\
X    }						\
X    else					\
X    {						\
X	static type static_val;			\
X	static_val = (value);			\
X	toVal->addr = (caddr_t)&static_val;	\
X    }						\
X    toVal->size = sizeof(type);			\
X    return;					\
X}
X
X/*
X*******************************************************************************
X* Private_data_definitions.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Private_function_declarations.
X*******************************************************************************
X*/
X
X/*
X    -- Convert String To ClassPtr
X*******************************************************************************
X    This conversion searches the Object Class cache for the appropriate
X    Cache record.  The resource database string is simply the name
X    of the class pointer, case insensitive.  The value provided is the
X    widget class pointer, as passed to XtCreateWidget().
X*/
X
Xvoid CvtStringToClassPtr (args, num_args, fromVal, toVal )
X    XrmValue  *args;
X    Cardinal  *num_args;
X    XrmValue  *fromVal;
X    XrmValue  *toVal;
X{
X    char*       string = (char *) fromVal->addr;
X    char        cleanName[MAX_XRMSTRING];
X    char*       lowerCase;
X    XrmQuark    quark;
X    int         i;
X
X    (void)WcCleanName ( string, cleanName );
X    lowerCase = WcLowerCaseCopy ( cleanName );
X    quark = XrmStringToQuark ( lowerCase );
X    XtFree ( lowerCase );
X
X    for (i=0; i<classes_num; i++)
X    {
X        if ( classes_ptr[i].quark == quark )
X        {
X            done( WidgetClass, classes_ptr[i].class );
X        }
X    }
X    XtStringConversionWarning (cleanName, "Object Class, not registered.");
X}
X
X/*
X    -- Convert String To ClassName
X*******************************************************************************
X    This conversion searches the Class Name cache for the appropriate
X    Cache record.  The resource database string is simply the name
X    of the class, case insensitive.  The value provided is the widget 
X    class pointer, as passed to XtCreateWidget().
X*/
X
Xvoid CvtStringToClassName (args, num_args, fromVal, toVal )
X    XrmValue  *args;
X    Cardinal  *num_args;
X    XrmValue  *fromVal;
X    XrmValue  *toVal;
X{
X    char*	string = (char *) fromVal->addr;
X    char	cleanName[MAX_XRMSTRING];
X    char* 	lowerCase;
X    XrmQuark	quark;
X    int		i;
X
X    (void)WcCleanName ( string, cleanName );
X    lowerCase = WcLowerCaseCopy ( cleanName );
X    quark = XrmStringToQuark ( lowerCase );
X    XtFree ( lowerCase );
X
X    for (i=0; i<cl_nm_num; i++)
X    {
X        if ( cl_nm_ptr[i].quark == quark )
X        {
X	    done( WidgetClass, cl_nm_ptr[i].class );
X        }
X    }
X    XtStringConversionWarning (cleanName, "Class Name, not registered.");
X}
X
X/*
X    -- Convert String To Constructor
X*******************************************************************************
X    This conversion searches the Constructor Cache for the appropriate
X    Cache record.  The resource database string is simply the name
X    of the constructor, case insensitive.  The value provided is a
X    Contrstructor Cache Record.  The constructor (func ptr) itself is
X    not provided, as the user of this value (generally WcCreateDatabaseChild)
X    also likes to have the constructor name as registered for error messages.
X*/
X
Xvoid CvtStringToConstructor (args, num_args, fromVal, toVal)
X    XrmValue *args;
X    Cardinal *num_args;
X    XrmValue *fromVal;
X    XrmValue *toVal;
X{
X    char*       string = (char *) fromVal->addr;
X    char        cleanName[MAX_XRMSTRING];
X    char*       lowerCase;
X    XrmQuark    quark;
X    int         i;
X
X    (void)WcCleanName ( string, cleanName );
X    lowerCase = WcLowerCaseCopy ( cleanName );
X    quark = XrmStringToQuark ( lowerCase );
X    XtFree ( lowerCase );
X
X    for (i=0; i<constrs_num; i++)
X    {
X	if ( constrs_ptr[i].quark == quark )
X	{
X	    done( ConCacheRec*, &(constrs_ptr[i]) );
X	}
X    }
X    XtStringConversionWarning (cleanName, "Constructor, not registered.");
X}
X
X/*
X    -- Convert String To Callback
X*******************************************************************************
X    This conversion creates a callback list structure from the X resource
X    database string in format:
X
X    name(arg),name(arg).....
X
X    Note "name" is not case sensitive, while "arg" may be - it is passed to
X    a callback as client data as a null terminated string (first level
X    parenthesis stripped off).  Even if nothing is specified e.g.,
X    SomeCallback() there is a null terminated string passed as client
X    data to the callback.  If it is empty, then it is the null string.
X
X    Note also that the argument CANNOT be converted at this point: frequently,
X    the argument refers to a widget which has not yet been created, or
X    uses the context of the callback (i.e., WcUnmanageCB( this ) uses the
X    widget which invoked the callback).  
X*/
X
Xtypedef struct
X{
X    char *name_start, *name_end;    /* callback name start, end */
X    char *arg_start,  *arg_end;     /* argument string start, end */
X} Segment;
X
X#ifdef FUNCTION_PROTOTYPES
Xstatic int ParseCallbackString( char*, Segment*, int );
Xstatic XtCallbackRec* BuildCallbackList( Segment* );
Xstatic int GetCallbackAddrFromCache(char*, char*, XtCallbackRec* );
Xstatic void CopyArgsToCallbackClosure( char*, char*, XtCallbackRec* );
X#else
Xstatic int ParseCallbackString();
Xstatic XtCallbackRec* BuildCallbackList();
Xstatic int GetCallbackAddrFromCache();
Xstatic void CopyArgsToCallbackClosure();
X#endif
X
X/*
X    -- Convert String To Callback
X*******************************************************************************
X*/
X
Xvoid CvtStringToCallback (args, num_args, fromVal, toVal)
X    XrmValue *args;
X    Cardinal *num_args;
X    XrmValue *fromVal;
X    XrmValue *toVal;
X{
X    static XtCallbackRec* retval;	/* return value MUST be static */
X
X    Segment	name_arg_segments[MAX_CALLBACKS];	
X    char*	string = (char *) fromVal->addr;
X
X/*  -- assume error or undefined input argument */
X    toVal->size = 0;
X    toVal->addr = (caddr_t) NULL;
X
X    if (ParseCallbackString( string, name_arg_segments, MAX_CALLBACKS ))
X	return;
X
X    /* name_arg_segments[MAX_CALLBACKS-1].name_start MUST be NULL 
X    */
X    retval = BuildCallbackList( name_arg_segments );
X
X    toVal->size = sizeof(XtCallbackRec*);
X    toVal->addr = (caddr_t)&retval;
X}
X
X/*
X    -- Parse string into name+argument segments: returns 1 if failed
X*******************************************************************************
X*/
X
Xstatic int ParseCallbackString( string, seg, num_segs )
X    char*	string;
X    Segment*	seg;
X    int		num_segs;
X{
X    register char* 	cp = string;
X    register char* 	ws;
X    register int	in_parens = 0;
X
X/*  -- Don't need to do anything if there is nothing interesting in string */
X    if ( cp == NULL) return 1;
X    if (*cp == NULL) return 1;
X
X    /* skip leading whitespace */
X    while( *cp <= ' ' )
X	if (*++cp == NULL) return 1;
X
X/*  -- Always end the parse on a null to make life easier */
X#define NEXT_CHAR if (*++cp == NULL) goto end_of_parse;
X#define BARF(str) { XtStringConversionWarning( string, str ); return 1; }
X
X    while (1)		/* parsing loop */
X    {
X	/* start new segment: we've got the start of the callback name,
X	** and nothing else.
X	*/
X	seg->name_start = cp;	
X        seg->name_end = seg->arg_start = seg->arg_end = (char*)NULL;
X
X
X	/* take care of possible error - barf if *cp is left paren or comma */
X	if ( *cp == '(' || *cp == ',' )
X	    BARF( "Callback, name cannot start with `(' or `,'" )
X
X	/* name is everything up to whitespace, a left paren, or comma */
X	while(   ' ' < *cp    &&    *cp != '('    &&    *cp != ','   )
X	    NEXT_CHAR
X
X	seg->name_end = cp-1;	/* found end of the callback name */
X
X	/* There may be whitespace between name and left paren or comma */
X	while( *cp <= ' ' )
X            NEXT_CHAR
X
X	/* if we've found a left paren, collect the argument */
X	if ( *cp == '(' )
X	{
X	    ws = cp;	/* actually points at initial left paren */
X	    in_parens = 1;
X	    while (in_parens)
X	    {
X		NEXT_CHAR	/* 1st time skips the initial left paren */
X		if ( '(' == *cp ) in_parens++;
X		if ( ')' == *cp ) in_parens--;
X	    }
X	    /* Now cp actually points at final right paren.  Lets get rid of
X	    ** leading and trailing argument whitespace.  If only whitespace
X	    ** then leave seg->arg_start == seg->arg_end == NULL 
X	    */
X	    do {
X		ws++;	/* skip initial '(', will hit ')' at cp if no arg */
X	    } while ( *ws <= ' ' );
X	    if (ws != cp)
X	    {
X		seg->arg_start = ws; /* first non-whitespace of argument */
X		ws = cp;	     /* now look at the final right paren */
X		do {
X		    ws--;
X		} while ( *ws <= ' ' );
X		seg->arg_end = ws;
X	    }
X	    NEXT_CHAR		/* skip final right paren */
X	}
X	/* Skip optional comma separator, then do next segment */
X	while( *cp <= ' ' || *cp == ',' )
X	    NEXT_CHAR
X
X	seg++;
X	/* NB: we must have space for following `NULL' segment */
X	if ( --num_segs < 2 )
X	    BARF( "Callback, Too many callbacks" );
X    }
X
Xend_of_parse:
X    /* Got here because we've detected the NULL terminator.  We
X    ** could have hit the NULL at any of the "NEXT_CHAR" invocations.
X    */
X
X    if (seg->name_start && !seg->name_end)
X	seg->name_end = cp-1;			/* callback name */
X    else if ( in_parens )
X	BARF( "Callback, Unbalanced parens in callback argument" )
X
X    seg++; seg->name_start = (char*)NULL;	/* following seg is NULL */
X
X    return 0; /* sucessful parse */
X}
X
X/*
X    -- Build XtCallbackList based on name+arg segments
X*******************************************************************************
X*/
X
Xstatic XtCallbackRec* BuildCallbackList( seg )
X    Segment* seg;
X{
X    XtCallbackRec	callback_list[MAX_CALLBACKS];	/* temporary */
X    XtCallbackRec*	rec = callback_list;
X    int                 callback_list_len = 0;
X    int			bytes;
X
X/*  -- process individual callback string segments "name(arg)" */
X    for( ;  seg->name_start  ;  seg++ )
X    {
X	if ( GetCallbackAddrFromCache( seg->name_start, seg->name_end, rec ) )
X	{
X	    CopyArgsToCallbackClosure( seg->arg_start,  seg->arg_end,  rec );
X	    rec++;
X	    callback_list_len++;
X	}
X    }
X
X/*  -- terminate the callback list */
X    {
X        rec->callback = NULL;
X	rec->closure  = NULL;
X	callback_list_len++;
X    }
X
X/*  -- make a permanent copy of the new callback list, and return a pointer */
X    bytes = callback_list_len * sizeof(XtCallbackRec);
X    rec = (XtCallbackRec*)XtMalloc( bytes );
X    memcpy ( (char*)rec, (char*)callback_list,  bytes );
X    return rec;
X}
X
X/*
X    -- Find named callback in callback cache: TRUE if found
X*******************************************************************************
X    Searches the Callback cache, gets the address of the callback
X    function, and the default closure data as registered.
X*/
X
Xstatic int GetCallbackAddrFromCache( name_start, name_end, rec )
X    char*          name_start;
X    char*          name_end;
X    XtCallbackRec* rec;
X{
X    static   char  lowerCaseName[MAX_XRMSTRING];
X    register char* cp   = name_start;
X    register char* dest = lowerCaseName;
X    register int   i;
X    XrmQuark       quark;
X
X    /* our callback cache names are case insensitive */
X    while( cp <= name_end )
X        *dest++ = (isupper(*cp) ) ? tolower (*cp++) : *cp++;
X    *dest = NUL;
X
X    /* try to locate callback in our cache of callbacks */
X    quark = XrmStringToQuark (lowerCaseName);
X
X    for ( i=0 ; i < callbacks_num ; i++ )
X    {
X        if ( callbacks_ptr[i].quark == quark )
X	{
X	    rec->callback = callbacks_ptr[i].callback;
X	    rec->closure  = callbacks_ptr[i].closure; /* default closure */
X	    return 1;
X	}
X    }
X    XtStringConversionWarning ( lowerCaseName,
X	"Callback, unknown callback name");
X    return 0;
X}
X
X/*
X    -- Copy arguments from segment into XtCallbackList
X*******************************************************************************
X*/
X
Xstatic void CopyArgsToCallbackClosure( arg_start,  arg_end,  rec )
X    char*          arg_start;
X    char*          arg_end;
X    XtCallbackRec* rec;
X{
X    register char *arg;
X    register int   alen;
X	   
X    if ( arg_start )
X    {
X	/* arg in parens - pass as string replacing default closure */
X	alen = 1 + (int)arg_end - (int)arg_start;
X	arg  = XtMalloc(alen+1);
X	strncpy ( arg, arg_start, alen );
X	arg[alen]    = NUL;
X	rec->closure = (caddr_t)arg;
X    }
X    else
X    {
X	/* no arg in parens.  Make sure closure is something -
X	** do NOT return NULL in any event.  Causes SEGV too
X	** easily.  
X	*/
X	if (rec->closure == NULL)
X	    rec->closure = (caddr_t)"";
X    }
X}
X
X/*
X    -- Convert String To Widget
X*******************************************************************************
X    This conversion creates a Widget id from the X resource database string.
X    The conversion will fail, and WcFullNameToWidget() will issue a warning,
X    if the widget so named has not been created when this converter is called.
X    For example, if a widget refers to itself for some reason, during
X    its creation when this converter is called, it is not yet created: 
X    therefore, the converter will fail.
X*/
X
Xvoid XmuCvtStringToWidget (args, num_args, fromVal, toVal)
X    XrmValue *args;
X    Cardinal *num_args;
X    XrmValue *fromVal;
X    XrmValue *toVal;
X{
X    toVal->addr = 
X	(caddr_t) WcFullNameToWidget( WcRootWidget(NULL), fromVal->addr);
X    toVal->size = sizeof(Widget);
X}
X
X/*
X*******************************************************************************
X* Public_function_declarations.
X*******************************************************************************
X*/
X
X/*
X    -- Add String To ... Convertors
X*******************************************************************************
X*/
X
Xvoid WcAddConverters ( app )
X    XtAppContext app;
X{
X    ONCE_PER_XtAppContext( app );
X
X    XtAddConverter       (XtRString,
X                          WcRClassPtr,
X                          CvtStringToClassPtr,
X                          (XtConvertArgList)NULL,
X                          (Cardinal)0);
X
X    XtAddConverter       (XtRString,
X                          WcRClassName,
X                          CvtStringToClassName,
X                          (XtConvertArgList)NULL,
X                          (Cardinal)0);
X
X    XtAddConverter       (XtRString,
X                          WcRConstructor,
X                          CvtStringToConstructor,
X                          (XtConvertArgList)NULL,
X                          (Cardinal)0);
X
X    XtAddConverter       (XtRString, 
X                          XtRCallback,
X                          CvtStringToCallback,
X                          (XtConvertArgList)NULL,
X                          (Cardinal)0);
X
X    XtAddConverter       (XtRString,
X                          XtRWidget,
X                          XmuCvtStringToWidget,
X                          (XtConvertArgList)NULL,
X                          (Cardinal)0);
X}
END_OF_FILE
if test 21715 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcConvert.c'`; then
    echo shar: \"'xrainbow/Wc1_05/Wc/WcConvert.c'\" unpacked with wrong size!
fi
# end of 'xrainbow/Wc1_05/Wc/WcConvert.c'
fi
if test -f 'xrainbow/Wc1_05/Wc/WcCreate.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcCreate.c'\"
else
echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcCreate.c'\" \(27716 characters\)
sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcCreate.c' <<'END_OF_FILE'
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: @(#)WcCreate.c 1.1 ( 19 Nov 90 )
X*
X* Subsystem_group:
X*
X*     Widget Creation Library
X*
X* Module_description:
X*
X*     This module contains the functions used to create and manage 
X*     a widget tree using the Xrm database.
X
X*     The Xrm database format used to prescribe widget's children
X*     is as follows:
X*
X*     ...parent.wcChildren:         childName1, childName2, ...
X*
X*     The type of each child must be specified.  There are three
X*     ways of doing this: (1) by widget class (class pointer name),
X*     (2) by widget class name, and (3) by widget constructor 
X*     function name.  The resource value given is case insensitive,
X*     although one is encouraged to use the capitalization given
X*     in the reference manuals simply on stylistic grounds.  The 
X*     three examples below are effectively equivalent:
X*
X*     ...drawing.wcClass:	xmDrawingAreaWidgetClass
X*     ...drawing.wcClassName:	XmDrawingArea
X*     ...drawing.wcConstructor: XmCreateDrawingArea
X*
X*     Since there are multiple ways of specifying the widget type,
X*     a precedence is defined: wcClass is the highest precedence,
X*     and wcClass > wcClassName > wcConstructor.
X*
X*     Currently, the Motif widget set defines many constructors, such 
X*     as XmCreateForm or XmCreateFileSelectionBox.  Constructors are 
X*     somtimes called Convenience Functions or even Confusion Functions.  
X*     It is highly recommended that you use the WcTrace resource when
X*     first using Constructors in order to see the resulting widget
X*     heirarchy more clearly.  The WcTrace resource is specified as:
X*
X*     ...drawing.wcTrace:	True
X
X*     By default, all widgets created from the Xrm resource database
X*     are managed.  In some cases, this is not what is desired: for
X*     example, pop-up menus are generally not managed when they are
X*     created, rather they are managed due to some mouse event.  In
X*     such cases, the WcManaged resource should be set False, as below:
X*
X*     *fileMenu.wcManaged:	False
X
X*     It is possible to bind one or more callback functions to the
X*     creation of a widget by using the WcCallback resource.  For 
X*     example, using the Motif widget set, when a menu bar is created 
X*     as a child of an XmMainWindow, the menuBar resource of the 
X*     XmMainWindow needs to be set to refer to the menu bar.  For 
X*     example:
X*
X*     App.main.wcClassName:	XmMainWindow
X*     App.main.wcChildren:	mbar
X*     *mbar.wcConstructor:	XmCreateMenuBar
X*     *mbar.wcCallback:		WcSetResourceCB( *main.menuBar: this)
X
X*     Sometimes widget heirarchies are dynamic: many of the widgets
X*     are created at initialization time, but others need to be created
X*     at run time.  Simply do not include the names of the dynamic
X*     created widgets in any wcChildren resource.  They will then still
X*     be defined in the Xrm database, but they will not be created
X*     during the initial widget tree creation.
X
X*     The WcDeferred resource is an obsolete mechanism which should no
X*     longer be used.
X
X*     For example, let's say your interface includes a box world, where
X*     the user can create an arbitrary number of various types of boxes:
X
X*     *box_world.wcClass:	MyBoxWorldWidgetClass
X*
X*     *box_type1.wcClass:	MyBoxType1WidgetClass
X*     *box_type2.wcClass:	MyBoxType2WidgetClass
X*     *box_type3.wcClass:	MyBoxType3WidgetClass
X*     *box_type3.wcChildren:	child1, child2, child3, child4
X*
X*     *button1.callback:	WcCreateChildrenCB( *box_world, box_type1 )
X*     *button2.callback:	WcCreateChildrenCB( *box_world, box_type2 )
X*     *button3.callback:	WcCreateChildrenCB( *box_world, box_type3 )
X*
X*     Initially, when box_world is created, it will have no children.
X*     Each time button1 is pressed, another instance of box_type1 will
X*     be created as a child of box_world, and managed (since wcManaged
X*     is by default True).  Similarly, everytime button2 is pressed
X*     another box_type2 will be created, and everytime button3 is
X*     pressed another box_type3 will be created, along with children
X*     named child1, child2, child3, and child4, and their children as 
X*     applicable.
X
X*     User interfaces are often rather complex.  Since the Widget
X*     Creation Library allows much more of the interface to be
X*     specified in resource files than in prehistoric days of
X*     Widget application programming, it becomes necessary to allow
X*     interfaces to be specified in a collection of resource files.
X*     
X*     It is very desirable that anything in the interface can be
X*     tailored by the user.  Therefore, each resource filename
X*     loaded to describe an interface must be searched for in 
X*     all the locations defined by the Xt Intrinsics.  This is
X*     exactly the same as the initial resource file.
X*
X*     Since a resource file may override any of the resources on
X*     a given widget, including other creation resources, the
X*     resource file name is first fetched before any of the other
X*     wc* resources.
X*
X*     A resource file name is specified as follows:
X*
X*     *menuBar.wcResFile:	MenuBar
X*
X*     Each of the standard directories will be searched in order
X*     for a file named MenuBar, and each merged into the resource database.
X
X*     The following is the complete set of resources which are 
X*     interpreted by the Widget Creation Library:
X*
X*     ...widget.wcChildren:	childName1, childName2, ...
X*     ...widget.wcClass:	classPointerName
X*     ...widget.wcClassName:	className
X*     ...widget.wcConstructor:  constructorFunctionName
X*     ...widget.wcTrace:	true/false (default = false)
X*     ...widget.wcManaged:	true/false (default = true)
X*     ...widget.wcCallback:	callback1(args), callback2(args), ...
X*     ...widget.wcResFile:	filename
X*
X*     In all cases, the Widget Creation resource names can be
X*     specified as Wc<name> or wc<name>, with the capitalized
X*     form having looser binding (representing the resource class).
X
X*     Example:
X*
X*		HelloWorld.wcChildren:  push
X*
X*		*push.wcClass:          xmPushButtonWidgetClass
X*		*push.labelString:      Hello World
X*		*push.activateCallback: WcExitCB(1)
X
X*     Since (for portability reasons) we can not assume runtime binding,
X*     all widget classes or creation routines (constructors) must be 
X*     "registered"  by the application BEFORE widget tree creation.
X*
X*     The widget tree creation is performed by the WcCreateDatabaseChild()
X*     function, which descends the widget tree recursively until no more
X*     children are found, or a non-composite widget/object is found.
X*
X*     Several convenience callbacks are provided with the package, allowing 
X*     deferred widget creation, control (manage/unmanage) and other utility
X*     functions.  These are found in WcCallb.c
X*
X* Module_history:
X                                                  
X*   mm/dd/yy  initials  function  action
X*   --------  --------  --------  ---------------------------------------------
X*   13Aug90   D.Smyth	Got rid of WcDefered stuff
X*   11Jul90   D.Smyth   Added wcResFile resource
X*   30Jun90   R.Whitby	WcWidgetCreation added call to WcRegisterWcActions
X*   19Jun90   D.Smyth	Version 1.0
X*   04/18/90  MarBru    many..    Changed w->core.name to XrmQuarkToString...
X*   03/27/90  MarBru    Creation  Converted to a completely new syntax
X*   02/16/90  MarBru    Create..  Limited creation to composite widgets/objects
X*
X* Design_notes:
X*
X*******************************************************************************
X*/
X/*
X*******************************************************************************
X* Include_files.
X*******************************************************************************
X*/
X
X/*  -- Operating system includes */
X#include <stdio.h>
X
X/*  -- X Window System includes */
X#include <X11/IntrinsicP.h>
X#include <X11/StringDefs.h>
X
X/*  -- Widget Creation Includes */
X#include "WcCreate.h"
X#include "WcCreateP.h"
X
X/*
X*******************************************************************************
X* Private_data_definitions.
X*******************************************************************************
X*/
X
Xstatic char     msg[MAX_ERRMSG];
X
X/*  -- Creation resources 
X	NOTE: All resource values are fetched at once, but if WcResFile
X	is specified, then the resource files must be loaded and then
X	the resources re-fetched.  This is an optimization: usually
X	WcResFile is not specified, so two fetches from the Xrm database
X	do not need to be done in the normal case.  If resource files are
X	loaded and the resources are re-fetched, WcResFile is ignored.
X	NOTE: The WcClass and WcClassName resources are both converted to
X        a class pointer, as we can construct useful error messages using:
X		class->core_class.class_name
X	However, the Constructor must be the entire constructor cache
X	record so we have the name of the constructor for the error
X	messages.
X	NOTE: WcClass and WcClassName write to different ResourceRec
X	members, so we can provide better error messages.
X*/
X
XXtResource wc_resources[] =
X  {
X    { WcNwcResFile,	WcCWcResFile,		XtRString,	sizeof(String),
X      XtOffset(ResourceRecPtr, resFile ),	XtRImmediate,	(caddr_t) NULL
X    },
X    { WcNwcChildren,	WcCWcChildren,		XtRString,	sizeof(String),
X      XtOffset(ResourceRecPtr, children ),	XtRImmediate,	(caddr_t) NULL
X    },
X    { WcNwcPopups,	WcCWcPopups,		XtRString,	sizeof(String),
X      XtOffset(ResourceRecPtr, popups ),	XtRImmediate,	(caddr_t) NULL
X    },
X    { WcNwcClass,	WcCWcClass,		WcRClassPtr,	sizeof(caddr_t),
X      XtOffset(ResourceRecPtr, class ),		XtRImmediate,	(caddr_t) NULL
X    },
X    { WcNwcClassName,	WcCWcClassName,		WcRClassName,	sizeof(caddr_t),
X      XtOffset(ResourceRecPtr, classFromName ),	XtRImmediate,	(caddr_t) NULL
X    },
X    { WcNwcConstructor,	WcCWcConstructor, 	WcRConstructor,	sizeof(caddr_t),
X      XtOffset(ResourceRecPtr, constructor ),	XtRImmediate,	(caddr_t) NULL
X    },
X    { WcNwcManaged,	WcCWcManaged,		XtRBoolean,	sizeof(Boolean),
X      XtOffset(ResourceRecPtr, managed),	XtRImmediate,	(caddr_t) TRUE
X    },
X    { WcNwcTrace,	WcCWcTrace,		XtRBoolean,	sizeof(Boolean),
X      XtOffset(ResourceRecPtr, trace),		XtRImmediate,	(caddr_t) FALSE
X    },
X    { WcNwcCallback,	WcCWcCallback,	XtRCallback,	sizeof(XtCallbackList),
X      XtOffset(ResourceRecPtr, callback ),	XtRImmediate,	(caddr_t) NULL
X    }
X  };
X
X/*
X*******************************************************************************
X* Private_function_declarations.
X*******************************************************************************
X*/
X
X#define TRACE_CREATION 1
X#define TRACE_POPUP 2
X
X#ifdef FUNCTION_PROTOTYPES
Xstatic void   GetWcResources( ResourceRec*, Widget, char* nm, char* class );
Xstatic int    DuplicateType ( ResourceRec*, Widget, char* nm, char* callr );
Xstatic Widget CreateWidget  ( ResourceRec*, Widget, char* nm, char* callr );
Xstatic Widget CreatePopup   ( ResourceRec*, Widget, char* nm, char* callr );
Xstatic void   CreationWarningMessage ( ResourceRec* rp, Widget pw, 
X			char* name, char* caller, char* func );
Xstatic void   PrintCreationTrace   ( ResourceRec*, Widget child, int traceTyp );
Xstatic void   CallCreationCallbacks( ResourceRec*, Widget child );
X#else
Xstatic void   GetWcResources();
Xstatic int    DuplicateType();
Xstatic Widget CreateWidget();
Xstatic Widget CreatePopup();
Xstatic void   CreationWarningMessage();
Xstatic void   PrintCreationTrace();
Xstatic void   CallCreationCallbacks();
X#endif
X
X/*
X*******************************************************************************
X* Public_function_declarations.
X*******************************************************************************
X*/
X
X/*
X    -- Create Widget Tree from Xrm Database
X*******************************************************************************
X    This routine creates widget children as defined in Xrm database.
X    It checks the widget resource "WcChildren", which is a list of
X    names of children to create. Each child must then be further defined
X    in the databse.
X
X    This function is frequently called from an application's main()
X    procedure after the application shell is created via XtInitialize().
X
X    Note that this function registers the converters for StringToWidget,
X    StringToCallback, and so forth.
X*/
X
Xvoid WcWidgetCreation ( root )
X    Widget       root;
X{
X    XtAppContext app = XtWidgetToApplicationContext( root );
X    char*	 fullName = WcWidgetToFullName( root );	/* must be XtFree'd */
X    ResourceRec  res;
X
X    /* register the root of this widget */
X    (void)WcRootWidget(root);
X
X    /* register the Xt standard widgets */
X    WcRegisterIntrinsic ( app );
X
X    /* register the Wc converters */
X    WcAddConverters( app );
X
X    /* register the Wc callbacks */
X    WcRegisterWcCallbacks ( app );
X
X    /* register the Wc actions */
X    WcRegisterWcActions ( app );
X
X    if ( XtIsSubclass( root, compositeWidgetClass ) )
X    {
X        XtGetApplicationResources ( root, &res,
X              wc_resources, XtNumber(wc_resources), NULL, 0 );
X    
X	if ( res.popups || res.children )
X	{
X	    if ( res.popups )
X		WcCreateNamedPopups ( root, res.popups );
X            if ( res.children )
X		WcCreateNamedChildren ( root, res.children );
X	}
X        else
X        {
X            sprintf( msg,
X            "WcWidgetCreation (%s) - Failed \n\
X             Problem: No children defined in Xrm database.\n\
X	     Possible: resource file not found (XENVIRONEMENT not set?), \n\
X	     Possible: top level widget in resource file not named %s",
X             fullName, root->core.name );
X            XtWarning( msg );
X	}
X    }
X
X     else
X    {
X        sprintf( msg,
X            "WcWidgetCreation (%s) - Failed \n\
X             Problem: %s is not a composite widget, cannot have children.",
X             fullName, fullName );
X        XtWarning( msg );
X    }
X
X    XtFree ( fullName );
X}
X
X/*
X    -- Create And Manage Named Children from Xrm Database
X*******************************************************************************
X    This function creates widget's children specified by names list,
X    by calling WcCreateDatabaseChild() for each of the names provided.
X
X    All the children are then managed, unless WcManaged resource is FALSE.
X
X    Note that widgets created by WcCreateDatabaseChild may or may not
X    be children of `pw' due to the use of constructors.  Only children
X    of `pw' may be managed via a call to XtManageChildren().  Other
X    widgets must be managed individually.  Usually, these widgets
X    are created by the XmCreateScrolled*() or XmCreate*Dialog confusion 
X    functions.
X*/
X
Xvoid WcCreateNamedChildren ( pw, names )
X    Widget      pw;         /* children's parent                            */
X    char*       names;      /* (list of) widget names to create             */
X{
X    Widget	child;
X    int		children = 0;
X    Widget	widget_children[MAX_CHILDREN];
X    int		other = 0;
X    Widget	widget_other[MAX_CHILDREN];
X    char	cleanName[MAX_XRMSTRING];
X    char*	next;
X    int		managed;
X    int		i;
X
X    if  ( !names ) return;
X
X    next = WcCleanName( names, cleanName );
X
X    while ( cleanName[0] )
X    {
X	child = WcCreateDatabaseChild ( pw, cleanName, &managed );
X	if ( child )
X	{
X	    if ( managed && (XtParent( child ) == pw ) )
X		widget_children[children++] = child;
X	    else if ( managed )
X		widget_other[other++] = child;
X	}
X	next = WcSkipWhitespace_Comma( next );
X	next = WcCleanName( next, cleanName );
X    }
X
X    if ( children ) 
X	XtManageChildren( widget_children, children );
X
X    for (i = 0 ; i < other ; i++)
X	XtManageChild( widget_other[i] );
X}
X
X/*
X    -- Create Named Popup Children from Xrm Database
X*******************************************************************************
X    This function creates widget's popup children specified by names list,
X    by calling WcCreateDatabasePopup() for each of the names provided.
X*/
X
Xvoid WcCreateNamedPopups ( pw, names )
X    Widget      pw;         /* children's parent                            */
X    char*       names;      /* (list of) names of popup widgets to create   */
X{
X    Widget      child;
X    char        cleanName[MAX_XRMSTRING];
X    char*       next;
X
X    if  ( !names ) return;
X
X    next = WcCleanName( names, cleanName );
X
X    while ( cleanName[0] )
X    {
X        child = WcCreateDatabasePopup ( pw, cleanName );
X        next = WcSkipWhitespace_Comma( next );
X        next = WcCleanName( next, cleanName );
X    }
X}
X
X/*
X    -- Create Widget from the Resource Database
X*******************************************************************************
X    WcCreateDatabaseChild() causes a normal child to be created.  This
X    implies that the parent widget is a composite widget.
X*/
X
XWidget WcCreateDatabaseChild ( pw, name, managed  )
X    Widget      pw;         /* child's parent */
X    char*       name;       /* child name to create */
X    int        *managed;    /* returned T/F: this child to be managed ? */
X{
X    ResourceRec res;		/* child's creation resources	*/
X    Widget      child;		/* what we create		*/
X    char*	className;	/* get after child is created	*/
X
X    *managed = FALSE;		/* Assume error */
X
X    if ( !XtIsSubclass( pw, compositeWidgetClass ) )
X    {
X	/* child is not a manager widget, so cannot create children */
X	char* parentName = WcWidgetToFullName( pw );
X	sprintf( msg,
X            "WcCreateDatabaseChild (%s) - children ignored \n\
X             Problem: %s is not a composite, cannot have children.",
X             parentName, parentName );
X	XtWarning( msg );
X	XtFree( parentName );
X	return (Widget)NULL;
X    }
X
X    GetWcResources		( &res, pw, name, name );
X    if (DuplicateType		( &res, pw, name, "WcCreateDatabaseChild" ))
X	return (Widget)NULL;
X
X    child = CreateWidget	( &res, pw, name, "WcCreateDatabaseChild" );
X
X    /* Now that widget is created, we can get the "class" resources */
X    className = child->core.widget_class->core_class.class_name;
X    GetWcResources		( &res, pw, name, className );
X
X    if (res.trace)
X	PrintCreationTrace	( &res, child, TRACE_CREATION );
X    if (res.callback)
X	CallCreationCallbacks	( &res, child );
X
X    if (res.popups)
X	WcCreateNamedPopups	( child, res.popups );
X    if (res.children)
X	WcCreateNamedChildren	( child, res.children );
X
X    *managed = res.managed;
X    return child;
X}
X
X/*
X    -- Create Popup Widget from the Resource Database
X*******************************************************************************
X    WcCreateDatabasePopup() causes a popup widget to be created.  Any
X    widget can have popup chidren.
X*/
X
XWidget WcCreateDatabasePopup ( pw, name )
X    Widget      pw;         /* child's parent */
X    char*       name;       /* child name to create */
X{
X    ResourceRec res;            /* child's creation resources   */
X    Widget      child;          /* what we create               */
X    char*	className;	/* get after child is created	*/
X
X    GetWcResources		( &res, pw, name, name );
X    if (DuplicateType		( &res, pw, name, "WcCreateDatabasePopup" ))
X	return (Widget)NULL;
X
X    child = CreatePopup		( &res, pw, name, "WcCreateDatabasePopup" );
X
X    /* Now that widget is created, we can get the "class" resources */
X    className = child->core.widget_class->core_class.class_name;
X    GetWcResources		( &res, pw, name, className );
X
X    if (res.trace)
X	PrintCreationTrace	( &res, child, TRACE_POPUP );
X    if (res.callback)
X	CallCreationCallbacks	( &res, child );
X
X    if (res.popups)
X	WcCreateNamedPopups	( child, res.popups );
X    if (res.children)
X	WcCreateNamedChildren	( child, res.children );
X
X    return child;
X}
X
X/*
X******************************************************************************* 
X**  Private functions used by WcCreateDatabaseChild and WcCreateDatabasePopup
X*******************************************************************************
X*/
X
X/*
X    -- Get Wc* Resources for named child of pw from Xrm resource database
X*******************************************************************************
X*/
X
Xstatic void GetWcResources( rp, pw, name, className )
X    ResourceRec* rp;
X    Widget       pw;
X    char*        name;
X    char*        className;
X{
X    /* Get creation resources for the child to be created.
X    ** After this XtGetSubresources() call, the resource structure `res'
X    ** contains resources specified in the Xrm database or the defaults.
X    */
X    XtGetSubresources ( pw, rp, name, className, 
X       wc_resources, XtNumber(wc_resources), NULL, 0 );
X
X    /* if a resource file is specified for this widget, first
X    ** load the resource file, then re-fetch the resources.
X    ** Notice that we don't check for resFile again.
X    */
X    if ( rp->resFile )
X    {
X	WcLoadResourceFileCB ( pw, rp->resFile, NULL );
X	XtGetSubresources ( pw, rp, name, className,
X	   wc_resources, XtNumber(wc_resources), NULL, 0 );
X    }
X}
X
X/*
X    -- See if duplicate type resources are specified for this widget
X*******************************************************************************
X   Exactly one of WcClass, WcClassName, or WcConstructor must be
X   specified in order to create a widget.  If none are specified,
X   or if more than one is specified, then this is an error, and
X   this function returns TRUE, and the widget should not then be
X   created.
X*/
X
Xstatic int DuplicateType( rp, pw, name, caller )
X    ResourceRec* rp;
X    Widget	 pw;
X    char*	 name;
X    char*        caller;
X{
X    /* Booleans */
X    int class       = (NULL != rp->class);
X    int className   = (NULL != rp->classFromName);
X    int constructor = (NULL != rp->constructor);
X    char* reason;
X    char* parentName;
X    
X    if ( class + className + constructor == 0 )
X	reason = "No WcClass, WcClassName, nor WcConstructor";
X
X    else if ( class + className + constructor == 3 )
X	reason = "WcClass, WcClassName, and WcConstructor";
X
X    else if ( class + className == 2 )
X	reason = "WcClass and WcClassName";
X
X    else if ( class + constructor == 2 )
X	reason = "WcClass and WcConstructor";
X
X    else if ( className + constructor == 2 )
X	reason = "WcClassName and WcConstructor";
X
X    else
X	return 0; /* OK */
X
X    parentName = WcWidgetToFullName( pw );
X    sprintf( msg,
X            "%s (%s.%s) - Failed (Ambiguous) \n\
X             Problem: %s specified, \n\
X                      child %s.%s not created.",
X	     caller, parentName, name, 
X	     reason, 
X	     parentName, name );
X    XtWarning( msg );
X    XtFree( parentName );
X    return 1;
X}
X
X/*
X    -- Create child widget using XtCreateWidget or constructor
X*******************************************************************************
X*/
X
Xstatic Widget CreateWidget ( rp, pw, name, caller )
X    ResourceRec* rp;
X    Widget       pw;
X    char*        name;
X    char*	 caller;
X{
X    Widget child;
X
X    if ( rp->class )
X	child = XtCreateWidget ( name, rp->class, pw, NULL, 0 );
X    else if ( rp->classFromName )
X	child = XtCreateWidget ( name, rp->classFromName , pw, NULL, 0 );
X    else /* rp->constructor */
X	child = rp->constructor->constructor( pw, name, NULL, 0 );
X
X    if (child)
X	return child;
X    CreationWarningMessage( rp, pw, name, caller, "XtCreateWidget" );
X    return (Widget)NULL;
X}
X
X/*
X    -- Create child widget using XtCreateWidget or constructor
X*******************************************************************************
X*/
X
Xstatic Widget CreatePopup ( rp, pw, name, caller )
X    ResourceRec* rp;
X    Widget       pw;
X    char*        name;
X    char*        caller;
X{
X    Widget child;
X
X    if ( rp->class )
X        child = XtCreatePopupShell ( name, rp->class, pw, NULL, 0 );
X    else if ( rp->classFromName )
X        child = XtCreatePopupShell ( name, rp->classFromName , pw, NULL, 0 );
X    else /* rp->constructor */
X        child = rp->constructor->constructor( pw, name, NULL, 0 );
X
X    if (child)
X        return child;
X    CreationWarningMessage( rp, pw, name, caller, "XtCreatePopupShell" );
X    return (Widget)NULL;
X}
X
X/*
X    -- Print warning message when CreateWidget or CreatePopup fail
X*******************************************************************************
X*/
X
Xstatic void CreationWarningMessage ( rp, pw, name, caller, func )
X    ResourceRec* rp;
X    Widget       pw;
X    char*        name;
X    char*        caller;
X    char*	 func;
X{
X    char* parentName = WcWidgetToFullName( pw );
X    static char funcWithArgs[1024];
X
X    if ( rp->class || rp->classFromName )
X    {
X        sprintf( funcWithArgs, "%s( %s, %s )", 
X                    func, name, rp->class->core_class.class_name );
X    }
X    else /* rp->constructor */
X    {
X        sprintf( funcWithArgs, "%s( %s )", rp->constructor->name, name );
X    }
X
X    sprintf( msg,
X            "%s (%s.%s) - Failed \n\
X             Problem: %s failed.",
X             caller, parentName, name, 
X	     funcWithArgs );
X
X    XtWarning( msg );
X    XtFree( parentName );
X}
X
X/*
X    -- Print creation trace message
X*******************************************************************************
X*/
X
Xstatic void PrintCreationTrace( rp, child, traceType )
X    ResourceRec* rp;
X    Widget       child;
X    int		 traceType;
X{
X    char* childName = WcWidgetToFullName( child );
X    char* trace;
X
X    if (traceType == TRACE_CREATION)
X	trace = (rp->managed) ? "  managed" : "unmanaged";
X    else
X	trace = "   pop-up";
X
X    fprintf(stderr,"Wc %s: %s of class %s\n",
X	trace,
X	childName, 
X	child->core.widget_class->core_class.class_name);
X
X    XtFree( childName  );
X}
X
X/*
X    -- Call creation time callbacks specified by WcCallbacks resource.
X*******************************************************************************
X*/
X
Xstatic void CallCreationCallbacks( rp, child )
X    ResourceRec* rp;
X    Widget       child;
X{
X    XtCallbackRec *cb = rp->callback;
X    for ( ; cb->callback; cb++ )
X        (*cb->callback)( child, cb->closure, NULL );
X}
END_OF_FILE
if test 27716 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcCreate.c'`; then
    echo shar: \"'xrainbow/Wc1_05/Wc/WcCreate.c'\" unpacked with wrong size!
fi
# end of 'xrainbow/Wc1_05/Wc/WcCreate.c'
fi
if test -f 'xrainbow/Wc1_05/Wc/WcCreate.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcCreate.h'\"
else
echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcCreate.h'\" \(7512 characters\)
sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcCreate.h' <<'END_OF_FILE'
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: @(#)WcCreate.h 1.1 ( 19 Nov 90 )
X*
X* Include_name:
X*
X*     WcCreate.h
X*
X* Subsystem_group:
X*
X*     Widget Creation Library
X*
X* Include_description:
X*
X*     Public defines for the Widget Creation Library supporting widget 
X*     tree creation from the Xrm database.
X*
X* Include_history:
X*
X*   mm/dd/yy  initials  action
X*   --------  --------  -------------------------------------------------------
X*   07/16/90   D.Smyth  added WcAllowDuplicate*Reg... decls
X*   06/30/90   R.Whitby added WcRegisterWcActions declaration
X*   06/19/90   D.Smyth  Widget Creation Library version 1.0 Release
X*   04/04/90   marbru   updated, added new callbacks
X*   03/27/90   marbru   updated for new names
X*   03/02/90   marbru   created
X*
X*******************************************************************************
X*/
X#ifndef _WcCreate_h
X#define _WcCreate_h
X
X/*
X#include <X11/IntrinsicP.h>
X#include <X11/CoreP.h>
X#include <X11/ObjectP.h>
X*/
X
X#ifdef FUNCTION_PROTOTYPES
X/****************************** ANSI FUNC DECLS ******************************/
X
X#define APP XtAppContext
X#define EV extern void
X#define EW extern Widget
X#define EC extern char*
X
X/* -- Widget class, constructor, and callback proc registration routines */
X
XEV WcRegisterClassPtr   (APP, char* name,   WidgetClass class);
XEV WcRegisterClassName  (APP, char* name,   WidgetClass class);
XEV WcRegisterConstructor(APP, char* name,   Widget(*constructor) () );
XEV WcRegisterCallback   (APP, char* CBname, XtCallbackProc, caddr_t defCliData);
XEV WcRegisterAction	(APP, char* name,   XtActionProc proc );
XEV WcRegisterWcCallbacks(APP );
X
X/* -- Allow duplicate registration of classes, constructors, and callbacks */
X
XEV WcAllowDuplicateRegistration   ( int allowed );
XEV WcAllowDuplicateClassPtrReg    ( int allowed );
XEV WcAllowDuplicateClassNameReg   ( int allowed );
XEV WcAllowDuplicateConstructorReg ( int allowed );
XEV WcAllowDuplicateCallbackReg    ( int allowed );
X
X/* -- Widget action registration routine */
X
XEV WcRegisterWcActions   ( APP );
X
X/* -- Widget creation routines */
X
XEV WcWidgetCreation      ( Widget root );
XEV WcCreateNamedChildren ( Widget parent, char* names );
XEV WcCreateNamedPopups   ( Widget parent, char* names );
XEW WcCreateDatabaseChild ( Widget parent, char* name, int* managed );
XEW WcCreateDatabasePopup ( Widget parent, char* name );
X
X/* -- Widget name routines 
X**	The character buffer returned by WcNamesToWidgetList contains the
X**	names which could not be converted to widgets.  This buffer is static,
X**	so its contents are changed everytime WcNamesToWidgetList is called.
X**	The character buffer returned by WcWidgetToFullName must be XtFree'd
X**	by the caller.
X*/
X
XEW WcChildNameToWidget ( Widget w, char* childName );
XEW WcFullNameToWidget  ( Widget w, char* name );
XEC WcNamesToWidgetList ( Widget, char* names, Widget widgetList[], int* count);
XEC WcWidgetToFullName  ( Widget w );
X
X/*  -- Useful for argument parsing */
X
XEC WcLowerCaseCopy        ( char* in );			/* caller frees buf */
XEC WcSkipWhitespace       ( char* cp );
XEC WcSkipWhitespace_Comma ( char* cp );
XEC WcCleanName            ( char* in, char* out );	/* out[] must exist */
XEC WcStripWhitespaceFromBothEnds (char* name );		/* caller frees buf */
X
XEC WcGetResourceType          ( Widget, char* rName );	/* caller frees buf */
XEV WcSetValueFromString       ( Widget, char* rName, char* rVal );
XEV WcSetValueFromStringAndType( Widget, char* rName, char* rVal, char* rType );
X
XEC WcStrStr( char* searchThis, char* forThisPattern );	/* like ANSI strstr */
X
X#undef APP
X#undef EV
X#undef EW
X#undef EC
X
X#else
X/**************************** NON-ANSI FUNC DECLS ****************************/
X
X/* -- Widget constructor registration routine */
X
Xextern void WcRegisterClassPtr    ();
Xextern void WcRegisterClassName   ();
Xextern void WcRegisterConstructor ();
Xextern void WcRegisterCallback    ();
Xextern void WcRegisterAction	  ();
Xextern void WcRegisterWcCallbacks ();
X
X/* -- Allow duplicate registration of classes, constructors, and callbacks */
X
Xextern void WcAllowDuplicateRegistration   ();
Xextern void WcAllowDuplicateClassPtrReg    ();
Xextern void WcAllowDuplicateClassNameReg   ();
Xextern void WcAllowDuplicateConstructorReg ();
Xextern void WcAllowDuplicateCallbackReg    ();
X
X/* -- Widget action registration routine */
X
Xextern void WcRegisterWcActions       ();
X
X/* -- Widget creation routines */
X
Xextern void   WcWidgetCreation     	();
Xextern void   WcCreateNamedChildren	();
Xextern void   WcCreateNamedPopups	();
Xextern Widget WcCreateDatabaseChild	();
Xextern Widget WcCreateDatabasePopup	();
X
X/* -- Widget name routine */
X
Xextern Widget WcChildNameToWidget	();
Xextern Widget WcFullNameToWidget	();
Xextern char*  WcNamesToWidgetList	();	/* rets: names not converted */
Xextern char*  WcWidgetToFullName	();	/* ret'd buff must be free'd */
X
Xextern char* WcLowerCaseCopy               ();	/* ret'd buff must be free'd */
Xextern char* WcSkipWhitespace              ();
Xextern char* WcSkipWhitespace_Comma        ();
Xextern char* WcCleanName                   ();
Xextern char* WcStripWhitespaceFromBothEnds ();	/* ret'd buff must be free'd */
X
Xextern char* WcGetResourceType             ();	/* ret'd buff must be free'd */
Xextern void  WcSetValueFromString          ();
Xextern void  WcSetValueFromStringAndType   ();
X
Xextern char* WcStrStr ();			/* same as ANSI strstr() */
X
X#endif /* FUNCTION_PROTOTYPES */
X
X#endif /* _WcCreate_h */
END_OF_FILE
if test 7512 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcCreate.h'`; then
    echo shar: \"'xrainbow/Wc1_05/Wc/WcCreate.h'\" unpacked with wrong size!
fi
# end of 'xrainbow/Wc1_05/Wc/WcCreate.h'
fi
if test -f 'xrainbow/Wc1_05/Wc/WcCreateP.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcCreateP.h'\"
else
echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcCreateP.h'\" \(15619 characters\)
sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcCreateP.h' <<'END_OF_FILE'
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: @(#)WcCreateP.h 1.1 ( 19 Nov 90 )
X*
X* Include_name:
X*
X*     WcCreateP.h
X*
X* Subsystem_group:
X*
X*     Widget Creation Library
X*
X* Include_description:
X*
X*     Private defines for the Widget Creation Library supporting widget
X*     tree creation from the Xrm database.
X*
X* Include_history:
X*
X*   mm/dd/yy  initials  action
X*   --------  --------  -------------------------------------------------------
X*   11/14/90   D.Smyth  Added popup resources
X*   06/30/90   R.Whitby added Action declarations
X*   05/24/90   D.Smyth  created from provate section of WsCreate.h
X*   03/02/90   marbru   created
X*
X*******************************************************************************
X*/
X#ifndef _WcCreateP_h
X#define _WcCreateP_h
X
X/*
X*******************************************************************************
X* Private_constant_declarations.
X*******************************************************************************
X*/
X#undef  NUL
X#define NUL '\0'
X#define MAX_XRMSTRING   4096		/* max length of the Xrm DB string  */
X#define MAX_ERRMSG      1024		/* max length of error message      */
X#define MAX_CHILDREN    1024		/* max number of widget's children  */
X#define MAX_PATHNAME    1024		/* max length of the pathname       */
X#define INCR_REGISTRY     32		/* incr of cl, con, cb registries   */
X#define MAX_CALLBACKS     64            /* max callbacks per Xrm resource   */
X#define MAX_WIDGETS      512		/* max depth of a widget tree       */
X#define MAX_ROOT_WIDGETS  32		/* max # separate widget trees	    */
X#define MAX_RES_FILES    512		/* max # res file names per interf  */
X
X#define WcNwcResFile		"wcResFile"
X#define WcNwcChildren		"wcChildren"
X#define WcNwcPopups		"wcPopups"
X#define WcNwcClass		"wcClass"
X#define WcNwcClassName		"wcClassName"
X#define WcNwcConstructor	"wcConstructor"
X#define WcNwcManaged		"wcManaged"
X#define WcNwcTrace		"wcTrace"
X#define WcNwcCallback		"wcCallback"
X
X#define WcCWcResFile		"WcResFile"
X#define WcCWcChildren		"WcChildren"
X#define WcCWcPopups		"WcPopups"
X#define WcCWcClass		"WcClass"
X#define WcCWcClassName		"WcClassName"
X#define WcCWcConstructor	"WcConstructor"
X#define WcCWcManaged		"WcManaged"
X#define WcCWcTrace		"WcTrace"
X#define WcCWcCallback		"WcCallback"
X
X/* Motif 1.0 has a bug: widgets ask for Windows 
X** instead of Widgets for their resources...
X*/
X#define WcRWidget		"Window"
X#define WcRClassPtr		"ClassPtr"
X#define WcRClassName		"ClassName"
X#define WcRConstructor		"Constructor"
X/*
X*******************************************************************************
X* Private_type_declarations.
X*******************************************************************************
X*/
X
Xtypedef void   (*PtrFuncVoid)();	/* ptr to func returning void	*/
Xtypedef Widget (*PtrFuncWidget)();	/* ptr to func returning Widget	*/
X
X/* Registration structs: It is a good idea if the classes, class names,
X** constructors, and callbacks are registered with the same upper & lower 
X** case names as the names in the ref manuals and source files, as this 
X** makes the user error messages clearer.
X*/
X
Xtypedef struct                          /* Class cache record		*/
X{
X    String	   name;		/* class ptr name as registered	*/
X    XrmQuark       quark;               /* quarkified class ptr name	*/
X    WidgetClass    class;               /* widget class pointer		*/
X} ClCacheRec;
X
Xtypedef struct                          /* Class Name cache record	*/
X{
X    String	   name;		/* class name as registered	*/
X    XrmQuark       quark;               /* quarkified class name	*/
X    WidgetClass    class;               /* widget class pointer		*/
X} ClNameCacheRec;
X
Xtypedef struct                          /* Constructor cache record	*/
X{
X    String	   name;		/* constructor as registered	*/
X    XrmQuark       quark;               /* quarkified constructor name	*/
X    Widget         (*constructor)();    /* constructor function ptr	*/
X} ConCacheRec;
X
Xtypedef struct				/* Callback cache record	*/
X{
X    String         name;		/* name as registered 		*/
X    XrmQuark       quark;               /* quarkified callback name	*/
X    XtCallbackProc callback;            /* callback procedure pointer	*/
X    caddr_t	   closure;		/* default client data		*/
X} CBCacheRec;
X
Xtypedef struct  _ResourceRec
X{
X    String          resFile;            /* additional resource file name    */
X    String          children;           /* list of children names to create */
X    String          popups;             /* list of popup children to create */
X    WidgetClass     class;              /* widget class pointer             */
X    WidgetClass     classFromName;      /* widget class pointer             */
X    ConCacheRec*    constructor;	/* ptr to Constructo cache record   */
X    Boolean         managed;            /* created  managed (default TRUE)  */
X    Boolean         deferred;           /* deferred creation, (def FALSE)   */
X    Boolean         trace;              /* creation trace required          */
X    XtCallbackList  callback;           /* creation callback list           */
X} ResourceRec, *ResourceRecPtr;
X
X/*
X*******************************************************************************
X* Private_macro_definitions.
X*******************************************************************************
X    ONCE_PER_XtAppContext(app) should be invoked at the beginning of each 
X    function which performs registration, like MriRegisterMotif and 
X    AriRegisterAthena.  Note that this IS a macro: therefore, the return 
X    statement actually causes the return from the registration function.
X*/
X
X#define ONCE_PER_XtAppContext( app )	\
X{					\
X    static XtAppContext already[1024];	\
X    static int numApps = 0;		\
X    int i;				\
X					\
X    for (i = 0; i < numApps ; i++)	\
X        if (app == already[i])		\
X            return;			\
X					\
X    already[numApps++] = app;		\
X}
X
X/*
X*******************************************************************************
X* Private_data_definitions.
X*******************************************************************************
X    The following cache/registry of known widget classes and contructors,
X    initially empty, are loaded by the application using "registration"
X    routines.
X    Assuming small numbers of constructors, the sequential search
X    of such cache is (initially) considered acceptable.
X*/
X
X/*  -- Named class pointer cache, intially empty */
X
Xextern int         classes_num;
Xextern int         classes_max;
Xextern ClCacheRec* classes_ptr;
X
X/*  -- Class name cache, intially empty */
X
Xextern int             cl_nm_num;
Xextern int             cl_nm_max;
Xextern ClNameCacheRec* cl_nm_ptr;
X
X/*  -- Named object constructor cache, intially empty */
X
Xextern int          constrs_num;
Xextern int          constrs_max;
Xextern ConCacheRec* constrs_ptr;
X
X/*  -- Callback function cache, initially empty */
X
Xextern int	    callbacks_num;
Xextern int	    callbacks_max;
Xextern CBCacheRec*  callbacks_ptr;
X/*  -- Widget Creation resources */
X
Xextern XtResource wc_resources[];
X
X/*
X*******************************************************************************
X* Private_function_declarations.
X*******************************************************************************
X    The following functions are generally private functions to the
X    WcCreate routines, but they may be defined in different files from
X    where they are used.  Client programs probably should not invoke
X    these functions directly.
X*/
X
X#ifdef FUNCTION_PROTOTYPES
X/****************************** ANSI FUNC DECLS ******************************/
X
X#define EV extern void
X
X/*  -- Resource converters */
X
XEV WcAddConverters     ( XtAppContext );
XEV CvtStringToClassPtr    ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
XEV CvtStringToClassName   ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
XEV CvtStringToConstructor ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
XEV CvtStringToCallback    ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
XEV XmuCvtStringToWidget   ( XrmValue*, Cardinal*, XrmValue*, XrmValue* );
X
X/*  -- Find root widget of argument, remember if never seen before */
X
Xextern Widget WcRootWidget	( Widget );
X
X/*  -- Convenience Callbacks - Clients generally invoke these only
X       by binding them to widgets via the resource file.  They can
X       be programmatically bound, but generally should not be.
X*/
X
XEV WcCreateChildrenCB     (Widget w, char* parent_children, caddr_t unused   );
XEV WcCreatePopupsCB       (Widget w, char* parent_children, caddr_t unused   );
XEV WcManageCB             (Widget w, char* widgetNames,     caddr_t unused   );
XEV WcUnmanageCB           (Widget w, char* widgetNames,     caddr_t unused   );
XEV WcManageChildrenCB     (Widget w, char* parent_children, caddr_t unused   );
XEV WcUnmanageChildrenCB   (Widget w, char* parent_children, caddr_t unused   );
XEV WcDestroyCB            (Widget w, char* widgetNames,     caddr_t unused   );
XEV WcSetValueCB           (Widget w, char* name_res_resVal, caddr_t unused   );
XEV WcSetTypeValueCB       (Widget w, char* nm_res_type_val, caddr_t unused   );
XEV WcSetSensitiveCB       (Widget w, char* widgetNames,     caddr_t unused   );
XEV WcSetInsensitiveCB     (Widget w, char* widgetNames,     caddr_t unused   );
XEV WcLoadResourceFileCB   (Widget w, char* resFileName,     caddr_t unused   );
XEV WcTraceCB              (Widget w, char* annotation,      caddr_t unused   );
XEV WcPopupCB              (Widget w, char* widgetName,	    caddr_t unused   );
XEV WcPopupGrabCB          (Widget w, char* widgetName,	    caddr_t unused   );
XEV WcPopdownCB            (Widget w, char* widgetName,      caddr_t unused   );
XEV WcMapCB                (Widget w, char* widgetName,      caddr_t unused   );
XEV WcUnmapCB              (Widget w, char* widgetName,      caddr_t unused   );
XEV WcSystemCB             (Widget w, char* shellCmdString,  caddr_t unused   );
XEV WcExitCB               (Widget w, char* exitValue,       caddr_t unused   );
X
X/*  -- Convenience Actions - Clients generally invoke these only
X       by binding them to widgets via the resource file.  They can
X       be programmatically bound, but generally should not be.
X*/
X
X#define ACT_ARGS Widget w, XEvent *event, String *params, Cardinal *num_params
X
XEV WcCreateChildrenACT    ( ACT_ARGS );
XEV WcCreatePopupsACT      ( ACT_ARGS );
XEV WcManageACT            ( ACT_ARGS );
XEV WcUnmanageACT          ( ACT_ARGS );
XEV WcManageChildrenACT    ( ACT_ARGS );
XEV WcUnmanageChildrenACT  ( ACT_ARGS );
XEV WcDestroyACT           ( ACT_ARGS );
XEV WcSetValueACT          ( ACT_ARGS );
XEV WcSetTypeValueACT      ( ACT_ARGS );
XEV WcSetSensitiveACT      ( ACT_ARGS );
XEV WcSetInsensitiveACT    ( ACT_ARGS );
XEV WcLoadResourceFileACT  ( ACT_ARGS );
XEV WcTraceACT             ( ACT_ARGS );
XEV WcPopupACT             ( ACT_ARGS );
XEV WcPopupGrabACT         ( ACT_ARGS );
XEV WcPopdownACT           ( ACT_ARGS );
XEV WcMapACT               ( ACT_ARGS );
XEV WcUnmapACT             ( ACT_ARGS );
XEV WcSystemACT            ( ACT_ARGS );
XEV WcExitACT              ( ACT_ARGS );
X
X#undef ACT_ARGS
X#undef EV
X
X#else
X/**************************** NON-ANSI FUNC DECLS ****************************/
X
X/*  -- Resource converters */
X
Xextern void WcAddConverters        ();
Xextern void CvtStringToClassPtr    ();
Xextern void CvtStringToClassName    ();
Xextern void CvtStringToConstructor ();
Xextern void CvtStringToCallback    ();
Xextern void XmuCvtStringToWidget   ();	/* note naming! replace Xmu... */
X
X/*  -- Find root widget of argument, remember if never seen before */
X
Xextern Widget WcRootWidget ();
X
X/*  -- Convenience Callbacks - Clients generally invoke these only
X       by binding them to widgets via the resource file.  They can
X       be programmatically bound, but generally should not be.
X*/
X
Xextern void WcCreateChildrenCB     ();
Xextern void WcCreatePopupsCB       ();
Xextern void WcManageCB             ();
Xextern void WcUnmanageCB           ();
Xextern void WcManageChildrenCB     ();
Xextern void WcUnmanageChildrenCB   ();
Xextern void WcDestroyCB            ();
Xextern void WcSetValueCB           ();
Xextern void WcSetTypeValueCB       ();
Xextern void WcSetSensitiveCB       ();
Xextern void WcSetInsensitiveCB     ();
Xextern void WcLoadResourceFileCB   ();
Xextern void WcTraceCB              ();
Xextern void WcPopupCB              ();
Xextern void WcPopupGrabCB          ();
Xextern void WcPopdownCB            ();
Xextern void WcMapCB                ();
Xextern void WcUnmapCB              ();
Xextern void WcSystemCB             ();
Xextern void WcExitCB               ();
X
X/*  -- Convenience Actions - Clients generally invoke these only
X       by binding them to widgets via the resource file.  They can
X       be programmatically bound, but generally should not be.
X*/
X
Xextern void WcCreateChildrenACT    ();
Xextern void WcCreatePopupsACT      ();
Xextern void WcManageACT            ();
Xextern void WcUnmanageACT          ();
Xextern void WcManageChildrenACT    ();
Xextern void WcUnmanageChildrenACT  ();
Xextern void WcDestroyACT           ();
Xextern void WcSetValueACT          ();
Xextern void WcSetTypeValueACT      ();
Xextern void WcSetSensitiveACT      ();
Xextern void WcSetInsensitiveACT    ();
Xextern void WcLoadResourceFileACT  ();
Xextern void WcTraceACT             ();
Xextern void WcPopupACT             ();
Xextern void WcPopupGrabACT         ();
Xextern void WcPopdownACT           ();
Xextern void WcMapACT               ();
Xextern void WcUnmapACT             ();
Xextern void WcSystemACT            ();
Xextern void WcExitACT              ();
X
X#endif /* FUNCTION_PROTOTYPES */
X
X#endif /* _WcCreateP_h */
END_OF_FILE
if test 15619 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcCreateP.h'`; then
    echo shar: \"'xrainbow/Wc1_05/Wc/WcCreateP.h'\" unpacked with wrong size!
fi
# end of 'xrainbow/Wc1_05/Wc/WcCreateP.h'
fi
if test -f 'xrainbow/include/X11/Xaw_d/DrawingA.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/include/X11/Xaw_d/DrawingA.h'\"
else
echo shar: Extracting \"'xrainbow/include/X11/Xaw_d/DrawingA.h'\" \(1399 characters\)
sed "s/^X//" >'xrainbow/include/X11/Xaw_d/DrawingA.h' <<'END_OF_FILE'
X/* DrawingA.h - Public Header file */
X
X/* Copyright 1990, David Nedde
X/*
X/* Permission to use, copy, modify, and distribute this
X/* software and its documentation for any purpose and without fee
X/* is granted provided that the above copyright notice appears in all copies.
X/* It is provided "as is" without express or implied warranty.
X*/
X
X/* Define widget's class pointer and strings used to specify resources */
X
X#ifndef _XawDrawingArea_h
X#define _XawDrawingArea_h
X
X/* Resources ADDED to label widget:
X
X Name		     Class		RepType		Default Value
X ----		     -----		-------		-------------
X exposeCallback	     Callback		Pointer		NULL
X inputCallback	     Callback		Pointer		NULL
X motionCallback	     Callback		Pointer		NULL
X resizeCallback	     Callback		Pointer		NULL
X*/
X
X
Xextern WidgetClass drawingAreaWidgetClass;
X
Xtypedef struct _DrawingAreaClassRec *DrawingAreaWidgetClass;
Xtypedef struct _DrawingAreaRec	    *DrawingAreaWidget;
X
X
X/* Resource strings */
X#define XtNexposeCallback	"exposeCallback"
X#define XtNinputCallback	"inputCallback"
X#define XtNmotionCallback	"motionCallback"
X#define XtNresizeCallback	"resizeCallback"
X
X
Xtypedef struct _XawDrawingAreaCallbackStruct {
X  int	  reason;
X  XEvent *event;
X  Window  window;
X} XawDrawingAreaCallbackStruct;
X
X/* Reasons */
X#define XawCR_EXPOSE 1
X#define XawCR_INPUT  2
X#define XawCR_MOTION 3
X#define XawCR_RESIZE 4
X
X#endif /* _XawDrawingArea_h */
END_OF_FILE
if test 1399 -ne `wc -c <'xrainbow/include/X11/Xaw_d/DrawingA.h'`; then
    echo shar: \"'xrainbow/include/X11/Xaw_d/DrawingA.h'\" unpacked with wrong size!
fi
# end of 'xrainbow/include/X11/Xaw_d/DrawingA.h'
fi
echo shar: End of archive 3 \(of 5\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 5 archives.
    echo "Please Read README"
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0

--
Dan Heller
O'Reilly && Associates       Z-Code Software    Comp-sources-x:
Senior Writer                President          comp-sources-x at uunet.uu.net
argv at ora.com                 argv at zipcode.com



More information about the Comp.sources.x mailing list