v13i064: xrainbow, Part02/05

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


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

#! /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 2 (of 5)."
# Contents:  xrainbow/Wc1_05/Wc/Makefile xrainbow/Wc1_05/Wc/WcActions.c
#   xrainbow/Wc1_05/Wc/WcCallb.c xrainbow/X11/Xaw_d/DrawingAP.h
#   xrainbow/X11/Xaw_d/Imakefile xrainbow/include/Wc
#   xrainbow/include/X11 xrainbow/include/X11/Xaw_d xrainbow/main
#   xrainbow/main/patchlevel.h
# Wrapped by daven at ash on Mon Jun  3 12:33:21 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'xrainbow/Wc1_05/Wc/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/Makefile'\"
else
echo shar: Extracting \"'xrainbow/Wc1_05/Wc/Makefile'\" \(10482 characters\)
sed "s/^X//" >'xrainbow/Wc1_05/Wc/Makefile' <<'END_OF_FILE'
X# Makefile generated by imake - do not edit!
X# $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
X#
X# The cpp used on this machine replaces all newlines and multiple tabs and
X# spaces in a macro expansion with a single space.  Imake tries to compensate
X# for this, but is not always successful.
X#
X
X###########################################################################
X# Makefile generated from "Imake.tmpl" and </tmp/IIf.a03937>
X# $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
X#
X# Platform-specific parameters may be set in the appropriate .cf
X# configuration files.  Site-wide parameters may be set in the file
X# site.def.  Full rebuilds are recommended if any parameters are changed.
X#
X# If your C preprocessor doesn't define any unique symbols, you'll need
X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
X# "make Makefile", "make Makefiles", or "make World").
X#
X# If you absolutely can't get imake to work, you'll need to set the
X# variables at the top of each Makefile as well as the dependencies at the
X# bottom (makedepend will do this automatically).
X#
X
X###########################################################################
X# platform-specific configuration parameters - edit sun.cf to change
X
X# platform:  $XConsortium: sun.cf,v 1.38 89/12/23 16:10:10 jim Exp $
X# operating system:  SunOS 4.1
X
X###########################################################################
X# site-specific configuration parameters - edit site.def to change
X
X# site:  $XConsortium: site.def,v 1.21 89/12/06 11:46:50 jim Exp $
X
X            SHELL = /bin/sh
X
X              TOP = ../../.
X      CURRENT_DIR = ./Wc1_05/Wc
X
X               AR = ar cq
X  BOOTSTRAPCFLAGS =
X               CC = cc
X
X         COMPRESS = compress
X              CPP = /lib/cpp $(STD_CPP_DEFINES)
X    PREPROCESSCMD = cc -E $(STD_CPP_DEFINES)
X          INSTALL = install
X               LD = ld
X             LINT = lint
X      LINTLIBFLAG = -C
X         LINTOPTS = -axz
X               LN = ln -s
X             MAKE = make
X               MV = mv
X               CP = cp
X           RANLIB = ranlib
X  RANLIBINSTFLAGS =
X               RM = rm -f
X     STD_INCLUDES =
X  STD_CPP_DEFINES =
X      STD_DEFINES =
X EXTRA_LOAD_FLAGS =
X  EXTRA_LIBRARIES =
X             TAGS = ctags
X
X    SHAREDCODEDEF = -DSHAREDCODE
X         SHLIBDEF = -DSUNSHLIB
X
X    PROTO_DEFINES =
X
X     INSTPGMFLAGS =
X
X     INSTBINFLAGS = -m 0755
X     INSTUIDFLAGS = -m 4755
X     INSTLIBFLAGS = -m 0664
X     INSTINCFLAGS = -m 0444
X     INSTMANFLAGS = -m 0444
X     INSTDATFLAGS = -m 0444
X    INSTKMEMFLAGS = -m 4755
X
X          DESTDIR =
X
X     TOP_INCLUDES = -I$(INCROOT)
X
X      CDEBUGFLAGS = -O
X        CCOPTIONS =
X      COMPATFLAGS = -DXAW_BC
X
X      ALLINCLUDES = $(STD_INCLUDES) $(TOP_INCLUDES) $(INCLUDES) $(EXTRA_INCLUDES)
X       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(PROTO_DEFINES) $(DEFINES) $(COMPATFLAGS)
X           CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
X        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
X           LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
X        LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS)
X   LDCOMBINEFLAGS = -X -r
X
X        MACROFILE = sun.cf
X           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut
X
X    IMAKE_DEFINES =
X
X         IRULESRC = $(CONFIGDIR)
X        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
X
X     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
X			$(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
X			$(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
X
X###########################################################################
X# X Window System Build Parameters
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X###########################################################################
X# X Window System make variables; this need to be coordinated with rules
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X          PATHSEP = /
X        USRLIBDIR = $(DESTDIR)/usr/lib
X           BINDIR = $(DESTDIR)/usr/bin/X11
X          INCROOT = $(DESTDIR)/usr/include
X     BUILDINCROOT = $(TOP)
X      BUILDINCDIR = $(BUILDINCROOT)/X11
X      BUILDINCTOP = ..
X           INCDIR = $(INCROOT)/X11
X           ADMDIR = $(DESTDIR)/usr/adm
X           LIBDIR = $(USRLIBDIR)/X11
X        CONFIGDIR = $(LIBDIR)/config
X       LINTLIBDIR = $(USRLIBDIR)/lint
X
X          FONTDIR = $(LIBDIR)/fonts
X         XINITDIR = $(LIBDIR)/xinit
X           XDMDIR = $(LIBDIR)/xdm
X           AWMDIR = $(LIBDIR)/awm
X           TWMDIR = $(LIBDIR)/twm
X           GWMDIR = $(LIBDIR)/gwm
X          MANPATH = $(DESTDIR)/usr/man
X    MANSOURCEPATH = $(MANPATH)/man
X           MANDIR = $(MANSOURCEPATH)n
X        LIBMANDIR = $(MANSOURCEPATH)3
X      XAPPLOADDIR = $(LIBDIR)/app-defaults
X
X        SOXLIBREV = 4.2
X          SOXTREV = 4.0
X         SOXAWREV = 4.0
X        SOOLDXREV = 4.0
X         SOXMUREV = 4.0
X        SOXEXTREV = 4.0
X
X       FONTCFLAGS = -t
X
X     INSTAPPFLAGS = $(INSTDATFLAGS)
X
X            IMAKE = imake
X           DEPEND = makedepend
X              RGB = rgb
X            FONTC = bdftosnf
X        MKFONTDIR = mkfontdir
X        MKDIRHIER = /bin/sh $(BINDIR)/mkdirhier.sh
X
X        CONFIGSRC = $(TOP)/config
X        CLIENTSRC = $(TOP)/clients
X          DEMOSRC = $(TOP)/demos
X           LIBSRC = $(TOP)/lib
X          FONTSRC = $(TOP)/fonts
X       INCLUDESRC = $(TOP)/X11
X        SERVERSRC = $(TOP)/server
X          UTILSRC = $(TOP)/util
X        SCRIPTSRC = $(UTILSRC)/scripts
X       EXAMPLESRC = $(TOP)/examples
X       CONTRIBSRC = $(TOP)/../contrib
X           DOCSRC = $(TOP)/doc
X           RGBSRC = $(TOP)/rgb
X        DEPENDSRC = $(UTILSRC)/makedepend
X         IMAKESRC = $(CONFIGSRC)
X         XAUTHSRC = $(LIBSRC)/Xau
X          XLIBSRC = $(LIBSRC)/X
X           XMUSRC = $(LIBSRC)/Xmu
X       TOOLKITSRC = $(LIBSRC)/Xt
X       AWIDGETSRC = $(LIBSRC)/Xaw
X       OLDXLIBSRC = $(LIBSRC)/oldX
X      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
X      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
X     MKFONTDIRSRC = $(FONTSRC)/mkfontdir
X     EXTENSIONSRC = $(TOP)/extensions
X
X  DEPEXTENSIONLIB = $(USRLIBDIR)/libXext.a
X     EXTENSIONLIB =  -lXext
X
X          DEPXLIB = $(DEPEXTENSIONLIB)
X             XLIB = $(EXTENSIONLIB) -lX11
X
X      DEPXAUTHLIB = $(USRLIBDIR)/libXau.a
X         XAUTHLIB =  -lXau
X
X        DEPXMULIB =
X           XMULIB = -lXmu
X
X       DEPOLDXLIB =
X          OLDXLIB = -loldX
X
X      DEPXTOOLLIB =
X         XTOOLLIB = -lXt
X
X        DEPXAWLIB =
X           XAWLIB = -lXaw
X
X LINTEXTENSIONLIB = $(USRLIBDIR)/llib-lXext.ln
X         LINTXLIB = $(USRLIBDIR)/llib-lX11.ln
X          LINTXMU = $(USRLIBDIR)/llib-lXmu.ln
X        LINTXTOOL = $(USRLIBDIR)/llib-lXt.ln
X          LINTXAW = $(USRLIBDIR)/llib-lXaw.ln
X
X          DEPLIBS = $(DEPXAWLIB) $(DEPXMULIB) $(DEPXTOOLLIB) $(DEPXLIB)
X
X         DEPLIBS1 = $(DEPLIBS)
X         DEPLIBS2 = $(DEPLIBS)
X         DEPLIBS3 = $(DEPLIBS)
X
X###########################################################################
X# Imake rules for building libraries, programs, scripts, and data files
X# rules:  $XConsortium: Imake.rules,v 1.67 89/12/18 17:14:15 jim Exp $
X
X###########################################################################
X# start of Imakefile
X
X###########################################################################
X# Imake rules for building and installing libraries, programs,
X# apps-defaults, and other data files.  Unlike Imake.rules, these
X# rules allow files to be installed anywhere.
X#
X# These rules *override* rules of the same name defined in Imake.rules!!
X#
X# New variables:
X#	INSTBIN		default to $BINDIR - programs installed here
X#	INSTMAN		default to $MANDIR - man pages installed here
X#	INSTAPP		default to $XAPPLOADDIR - apps-defaults files go here
X#
X# David E. Smyth: Install.rules Wed Jan  2 07:12:10 PST 1991
X
X###########################################################################
X# Makefile defines for Widget Creation Library distribution.
X# David E. Smyth: Wc.tmpl Wed Jan  2 07:44:04 PST 1991
X
X      INSTLIB = $(LIBDIR)
X      INSTLIN = $(LINTLIBDIR)
X      INSTINC = $(INCDIR)
X      INSTBIN = $(BINDIR)
X      INSTMAN = $(MANDIR)
X      INSTAPP = $(XAPPLOADDIR)
X
X   WCTOPDIR = .
X
X      WCLIB = -L$(INSTLIB) -lWc
X      XPLIB = -L$(INSTLIB) -lXp
X     XMPLIB = -L$(INSTLIB) -lXmp
X
X    SoWcRev = 1.05
X
X# Imakefile for libWc
X# This file is derived from mit/lib/Xt/Imakefile
X
XCDEBUGFLAGS= -g
X
X# If you are building libWc to run on top of an Xt older
X# than X11R4, then you must add Xt4GetResL.o to the list
X# of object files built into libWc.
X# Just define 0 to 1 (see ../Wc.tmpl) and it will build properly.
X
X    APP_DEFINES = -DXAPPLOADDIR=\"$(XAPPLOADDIR)$(PATHSEP)\"
X
XHEADERS = WcCreate.h WcCreateP.h
X
XSRCS = \
X	WcActions.c \
X	WcCallb.c \
X	WcConvert.c \
X	WcCreate.c \
X	WcName.c \
X	WcReg.c \
X	WcRegXt.c \
X	$(OLD_XT_SRCS)
X
XOBJS = \
X	WcActions.o \
X	WcCallb.o \
X	WcConvert.o \
X	WcCreate.o \
X	WcName.o \
X	WcReg.o \
X	WcRegXt.o \
X	$(OLD_XT_OBJS)
X
Xall::
X
Xall:: libWc.a
X
XlibWc.a: $(OBJS)
X	$(RM) $@
X	$(AR) $@ $(OBJS)
X	$(RANLIB) $@
X
Xinstall:: libWc.a
X	$(INSTALL) -c $(INSTLIBFLAGS) libWc.a $(INSTLIB)
X	$(RANLIB) $(RANLIBINSTFLAGS) $(INSTLIB)/libWc.a
X
Xlintlib:: llib-lWc.ln
X
Xllib-lWc.ln: $(SRCS)
X	$(RM) $@
X	$(LINT) $(LINTLIBFLAG)Wc $(LINTFLAGS) $(SRCS)
X
Xinstall.ln:: llib-lWc.ln
X	$(INSTALL) -c $(INSTLIBFLAGS) llib-lWc.ln $(INSTLIN)
X
Xinstall::
X	$(MKDIRHIER) $(INSTINC)/Wc
X
Xinstall:: $(HEADERS)
X	@case '${MFLAGS}' in *[i]*) set +e;; esac; \
X	for i in $(HEADERS); do \
X	(set -x; $(INSTALL) -c $(INSTALLFLAGS) $$i $(INSTINC)/Wc); \
X	done
X
Xdepend::
X	$(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
X
Xlint:
X	$(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
Xlint1:
X	$(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
X
X###########################################################################
X# common rules for all Makefiles - do not edit
X
Xemptyrule::
X
Xclean::
X	$(RM_CMD) \#*
X
XMakefile::
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) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
X
Xtags::
X	$(TAGS) -w *.[ch]
X	$(TAGS) -xw *.[ch] > TAGS
X
X###########################################################################
X# empty rules for directories that do not have SUBDIRS - do not edit
X
Xinstall::
X	@echo "install in $(CURRENT_DIR) done"
X
Xinstall.man::
X	@echo "install.man in $(CURRENT_DIR) done"
X
XMakefiles::
X
Xincludes::
X
X###########################################################################
X# dependencies generated by makedepend
X
END_OF_FILE
if test 10482 -ne `wc -c <'xrainbow/Wc1_05/Wc/Makefile'`; then
    echo shar: \"'xrainbow/Wc1_05/Wc/Makefile'\" unpacked with wrong size!
fi
# end of 'xrainbow/Wc1_05/Wc/Makefile'
fi
if test -f 'xrainbow/Wc1_05/Wc/WcActions.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcActions.c'\"
else
echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcActions.c'\" \(13852 characters\)
sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcActions.c' <<'END_OF_FILE'
X/*
X** Copyright (c) 1990 Rodney J. Whitby
X**
X** This file was derived from work performed by David E. Smyth under the
X** following copyright:
X**
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: @(#)WcActions.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 convenience actions used to create and 
X*     manage a widget tree using the Xrm databse.
X*
X*     Several convenience actions are provided with the package, allowing 
X*     deferred widget creation, control (manage/unmanage) and other utility
X*     functions.
X*
X* Module_interface_summary: 
X*
X*     Convenience Actions:
X*
X* Module_history:
X*                                                  
X*   All actions and the action registration routine were made by
X*   Rod Whitby following about 30 June 1990.
X*
X* Design_notes:
X*
X*******************************************************************************
X*/
X/*
X*******************************************************************************
X* Include_files.
X*******************************************************************************
X*/
X
X#include <X11/Intrinsic.h>
X#include "WcCreate.h"
X#include "WcCreateP.h"
X
X/*
X*******************************************************************************
X* Private_type_declarations.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Private_macro_definitions.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Private_data_definitions.
X*******************************************************************************
X*/
X
Xstatic char msg[1024];
X
X/*
X*******************************************************************************
X* Private_function_declarations.
X*******************************************************************************
X*/
X
X#define COMMAS 1
X#define NO_COMMAS 0
X
Xstatic char* AllocAndBuildString( params, num_params, commas )
X    char *params[];
X    int  *num_params;
X    int   commas;
X{
X    char *data;
X    int   len, i;
X
X    for ( len = 0, i = 0; i < *num_params; i++ )
X        len += strlen( params[i] ) + 1;
X
X    data = XtMalloc(len + 1);
X
X    (void)strcpy(data, params[0]);
X    for ( i = 1; i < *num_params; i++ )
X    {
X	if (commas)
X	    strcat(data, ",");
X	else
X	    strcat(data, " ");
X        (void)strcat(data, params[i]);
X    }
X    return data;
X}
X
Xstatic void SendToCallback( callback, w, params, num_params, min_reqd, commas )
X    XtCallbackProc callback;
X    Widget         w;
X    char          *params[];
X    int           *num_params;
X    int            min_reqd;
X    int            commas;
X{
X    char* data;
X
X    if ( *num_params < min_reqd )
X    {
X	callback( w, "", NULL );
X	return;
X    }
X
X    data = AllocAndBuildString( params, num_params, commas );
X
X    callback( w, data, NULL );
X    XtFree(data);
X}
X
X/*
X*******************************************************************************
X* Public_action_function_declarations.
X*******************************************************************************
X*/
X
X/*
X    -- Create Dynamic Children from Xrm Database
X*******************************************************************************
X    WcCreateChildrenACT( parent, child [, child ... ] )
X*/
Xvoid    WcCreateChildrenACT( w, event, params, num_params )
X    Widget      w;
X    XEvent     *event;
X    String     *params;
X    Cardinal   *num_params;
X{
X    SendToCallback( WcCreateChildrenCB, w, params, num_params, 2, COMMAS );
X}
X
X/*
X    -- Create Dynamic Popup Children from Xrm Database
X*******************************************************************************
X    WcCreatePopupsACT( parent, child [, child ... ] )
X*/
Xvoid    WcCreatePopupsACT( w, event, params, num_params )
X    Widget      w;
X    XEvent     *event;
X    String     *params;
X    Cardinal   *num_params;
X{
X    SendToCallback( WcCreatePopupsCB, w, params, num_params, 2, COMMAS );
X}
X
X/*
X    -- Manage or Unmanage named widget(s)
X*******************************************************************************
X    WcManageACT  ( widget_path [, widget_path ... ] )
X    WcUnmanageACT( widget_path [, widget_path ... ] )
X*/
Xvoid	WcManageACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcManageCB, w, params, num_params, 1, COMMAS );
X}
X
Xvoid	WcUnmanageACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcUnmanageCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X    -- Manage or unamange named children action
X*******************************************************************************
X    WcManageChildrenACT  ( parent, child [, child ... ] )
X    WcUnmanageChildrenACT( parent, child [, child ... ] )
X*/
Xvoid	WcManageChildrenACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcManageChildrenCB, w, params, num_params, 2, COMMAS );
X}
X
Xvoid	WcUnmanageChildrenACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcUnmanageChildrenCB, w, params, num_params, 2, COMMAS );
X}
X
X/*
X    -- Destroy named children action
X*******************************************************************************
X    WcDestroyACT( widget_path [, widget_path ... ] )
X*/
Xvoid	WcDestroyACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcDestroyCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X    -- Set Resource Value on Widget
X*******************************************************************************
X    WcSetValueACT( widget_path.res_name: res_val )
X*/
Xvoid	WcSetValueACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    /* note: blanks are optional, so we really don't know how many params 
X    ** we get from the translation manager: anything from 1 to 3. 
X    */
X    SendToCallback( WcSetValueCB, w, params, num_params, 1, NO_COMMAS );
X}
X
X/*
X    -- Set Resource Value on Widget
X*******************************************************************************
X    WcSetTypeValueACT( widget_path.res_name: type, res_val )
X*/
Xvoid	WcSetTypeValueACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcSetTypeValueCB, w, params, num_params, 1, NO_COMMAS );
X}
X
X/*
X    -- Change sensitivity of widgets.
X*******************************************************************************
X    WcSetSensitiveACT  ( widget_path [, widget_path ... ] )
X    WcSetInsensitiveACT( widget_path [, widget_path ... ] )
X*/
Xvoid	WcSetSensitiveACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcSetSensitiveCB, w, params, num_params, 1, COMMAS );
X}
X
Xvoid	WcSetInsensitiveACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcSetInsensitiveCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X    -- Load Resource File
X*******************************************************************************
X    WcLoadResourceFileACT( file_name )
X*/
Xvoid	WcLoadResourceFileACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcLoadResourceFileCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X    -- WcTraceAction
X*******************************************************************************
X    WcTraceACT( [ annotation ] )
X*/
Xvoid	WcTraceACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcTraceCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X  -- Popup and Popdown named widget
X*******************************************************************************
X    WcPopupACT    ( widget_path )
X    WcPopupGrabACT( widget_path )
X    WcPopdownACT  ( widget_path )
X*/
Xvoid    WcPopupACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcPopupCB, w, params, num_params, 1, COMMAS );
X}
X
Xvoid    WcPopupGrabACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcPopupGrabCB, w, params, num_params, 1, COMMAS );
X}
X
Xvoid    WcPopdownACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcPopdownCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X  -- Map and Unmap named widget
X*******************************************************************************
X    WcMapACT  ( widget_path )
X    WcUnmapACT( widget_path )
X*/
Xvoid	WcMapACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcMapCB, w, params, num_params, 1, COMMAS );
X}
X
Xvoid	WcUnmapACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcUnmapCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X    -- Invoke shell command
X*******************************************************************************
X    WcSystemACT( any shell command line )
X*/
Xvoid	WcSystemACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcSystemCB, w, params, num_params, 1, NO_COMMAS );
X}
X
X/*
X    -- Exit the application
X*******************************************************************************
X    WcExitACT( [ integer_exit_code ] )
X*/
Xvoid	WcExitACT( w, event, params, num_params )
X    Widget    w;
X    XEvent   *event;
X    String   *params;
X    Cardinal *num_params;
X{
X    SendToCallback( WcExitCB, w, params, num_params, 1, COMMAS );
X}
X
X/*
X  -- WcRegisterWcActions
X*******************************************************************************
X   Convenience routine, registering all standard actions in one application
X   call.   Called from WcWidgetCreation(), so application usually never needs
X   to call this.
X*/
X
Xvoid WcRegisterWcActions ( app )
XXtAppContext app;
X{
X    static XtActionsRec WcActions[] = {
X      {"WcCreateChildrenACT",	WcCreateChildrenACT	},
X      {"WcCreatePopupsACT",	WcCreatePopupsACT	},
X      {"WcManageACT",		WcManageACT		},
X      {"WcUnmanageACT",		WcUnmanageACT		},
X      {"WcManageChildrenACT",	WcManageChildrenACT	},
X      {"WcUnmanageChildrenACT",	WcUnmanageChildrenACT	},
X      {"WcDestroyACT",		WcDestroyACT		},
X      {"WcSetValueACT",		WcSetValueACT		},
X      {"WcSetTypeValueACT",	WcSetTypeValueACT	},
X      {"WcSetSensitiveACT",	WcSetSensitiveACT	},
X      {"WcSetInsensitiveACT",	WcSetInsensitiveACT	},
X      {"WcLoadResourceFileACT",	WcLoadResourceFileACT	},
X      {"WcTraceACT",		WcTraceACT		},
X      {"WcPopupACT",		WcPopupACT		},
X      {"WcPopupGrabACT",	WcPopupGrabACT		},
X      {"WcPopdownACT",		WcPopdownACT		},
X      {"WcMapACT",		WcMapACT		},
X      {"WcUnmapACT",		WcUnmapACT		},
X      {"WcSystemACT",		WcSystemACT		},
X      {"WcExitACT",		WcExitACT		},
X    };
X
X    ONCE_PER_XtAppContext( app );
X
X    XtAppAddActions(app, WcActions, XtNumber(WcActions));
X}
END_OF_FILE
if test 13852 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcActions.c'`; then
    echo shar: \"'xrainbow/Wc1_05/Wc/WcActions.c'\" unpacked with wrong size!
fi
# end of 'xrainbow/Wc1_05/Wc/WcActions.c'
fi
if test -f 'xrainbow/Wc1_05/Wc/WcCallb.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/Wc1_05/Wc/WcCallb.c'\"
else
echo shar: Extracting \"'xrainbow/Wc1_05/Wc/WcCallb.c'\" \(46686 characters\)
sed "s/^X//" >'xrainbow/Wc1_05/Wc/WcCallb.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: @(#)WcCallb.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 convenience callbacks used to create and 
X*     manage a widget tree using the Xrm databse.
X*
X*     Several convenience callbacks are provided with the package, allowing 
X*     deferred widget creation, control (manage/unmanage) and other utility
X*     functions.
X*
X* Module_interface_summary: 
X*
X*     Convenience Callbacks:
X*
X* Module_history:
X*                                                  
X*   Several of the callbacks and the callback registration routine were
X*   originally written by Martin Brunecky at Auto-Trol, between about
X*   the first of February 1990 until about 18 April 1990.
X*
X*   Additional callbacks and modifications to all callbacks and the
X*   callback registration routine were made by David Smyth at Jet
X*   Propulsion Laboratories following about 15 March 1990.
X*
X*   WcLoadResourceFileCB enhanced to remember which resource files have
X*   been loaded (by resource file name, not complete path name).  It now
X*   handles absolute pathnames starting at root or tilda, or uses the
X*   same search path algorithm used bu GetAppDefaults in X11R4 Xt.  I.e.,
X*   it uses XUSERFILESEARCHPATH, the user's home directory, and XAPPLRESDIR 
X*   in the same way that XtR4 does when it gets user's application defaults.  
X*   This code basically mimics GetAppUserDefaults() in mit/lib/Xt/Initialize.c
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*   All these callbacks could probably be declared as static.  They
X*   were not because applications may want to link them to widgets
X*   via C code.  
X*
X*   When Motif runs on release 4 Intrinsics, then all argument parsing
X*   should be replaced with coverters, so conversions get cached.  This
X*   will improve performance, especially for pop-ups.
X*
X*******************************************************************************
X*/
X/*
X*******************************************************************************
X* Include_files.
X*******************************************************************************
X*/
X
X#include <X11/Intrinsic.h>
X#include "WcCreate.h"
X#include "WcCreateP.h"
X
X#include <pwd.h>	/* to determine home dir for WcLoadResourceFileCB */
X
X/*
X*******************************************************************************
X* Private_type_declarations.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Private_macro_definitions.
X*******************************************************************************
X*/
X
X/*
X*******************************************************************************
X* Private_data_definitions.
X*******************************************************************************
X*/
X
X/* NOTE: These are shared arrays because they are large: i.e.,
X** this is a performance optimization intended to reduce page
X** faults which can occur while making large extensions to the
X** stack space.  Wait a minute: wouldn't this just happen
X** once, and then the stack space is alloc'd?  Yes, but a
X** huge stack space runs the risk of getting swapped, which causes
X** page faults.  This is probably a nit-picky sort of optimization.
X** Remember that D.Smyth is an old sys programmer from the stone
X** ages, and pity him instead of flaming him.
X** Be careful when filling msg not to call any funcs in here, 
X** so the message does not get garbled.
X*/
X
Xstatic char	msg[MAX_ERRMSG];
Xstatic char	cleanName[MAX_PATHNAME];
Xstatic Widget	widget_list[MAX_CHILDREN];
X
X/*
X*******************************************************************************
X* Private_function_declarations.
X*******************************************************************************
X*/
X
Xextern char*          getenv();
Xextern int            getuid();
Xextern struct passwd* getpwuid();
Xextern struct passwd* getpwnam();
X
X/* 
X    -- Find Home Directory
X*******************************************************************************
X    Used by WcLoadResourceFileCB.
X    Argument can be THIS_USER (a NULL) or can be a user's name.
X    The character string returned is in static storage, as returned
X    by getpwnam().
X*/
X
X#define THIS_USER ((char*)0)
X
Xstatic char* HomeDirectory( user )
X    char* user;
X{
X    struct passwd *pw;
X    char* homeDir = NULL;
X
X    if ( user == THIS_USER || *user == '\0' )
X    {
X	homeDir = getenv("HOME");
X
X        if (homeDir == NULL)
X        {
X            char* thisUser = getenv("USER");
X
X            if (thisUser == NULL)
X                pw = getpwuid( getuid() );
X            else
X                pw = getpwnam( thisUser );
X            if (pw)
X                homeDir = pw->pw_dir;
X        }
X    }
X    else
X    {
X	/* some other user */
X	pw = getpwnam( user );
X	if (pw)
X	    homeDir = pw->pw_dir;
X    }
X    return homeDir;
X}
X
X/*
X    -- Build Default User Serach Path suitable for XtResolvePathname
X*******************************************************************************
X    Used by WcLoadResourceFileCB.
X    Argument can be THIS_USER (a NULL) or can be a user's name.
X    Returns a pointer to static storage.
X*/
X
Xstatic char* DefaultUserSearchPath( user )
X    char* user;
X{
X    static char spath[3*MAX_PATHNAME + 80];
X
X    char* xApplResDir = getenv("XAPPLRESDIR");
X    char* homeDir     = HomeDirectory( user );
X
X    if (xApplResDir && homeDir)
X    {
X        sprintf( spath, "%s/%%L/%%N:%s/%%l/%%N:%s/%%N:%s/%%N",
X                xApplResDir, xApplResDir, xApplResDir, homeDir );
X    }
X    else if (xApplResDir)
X    {
X        sprintf( spath, "%s/%%L/%%N:%s/%%l/%%N:%s/%%N",
X                xApplResDir, xApplResDir, xApplResDir );
X    }
X    else if (homeDir)
X    {
X	sprintf( spath, "%s/%%L/%%N:%s/%%l/%%N:%s/%%N",
X		homeDir, homeDir, homeDir );
X    }
X    else
X    {
X	return NULL;
X    }
X    return spath;
X}
X
X/*
X*******************************************************************************
X* Public_callback_function_declarations.
X*******************************************************************************
X    The client data argument of callbacks MUST be a null terminated
X    string.  If client == (char*)0 this is an error.  The correct way
X    to pass no client information is *client == '\0'. The CvtStringToCallback
X    converter which actually causes these functions to be called (adds
X    these functions to widget's callback lists) does ensure that the
X    client data is a proper null terminated string.
X
X    Callbacks are not intended to be re-entrant nor recursive.  Many of
X    these use static buffers.
X*******************************************************************************
X*/
X
X/*
X    -- Create Dynamically Created Children from Xrm Database
X*******************************************************************************
X    This callback creates one or more specified children of a parent widget.
X    If parent name is `this' then widget invoking callback is used as the
X    parent.  Parent name can also be a wildcarded path name.  Child names
X    must be single part, specific children of the parent. Client data format:
X
X             parent, child [,child] ...
X    
X    This callback is used for deferred sub-tree creation, where named child
X    creation has been postponed because it was not included in a wcChildren
X    resource value.
X*/
X
Xstatic void CreateKids();
X
Xvoid WcCreateChildrenCB ( w, parent_children, unused )
X    Widget w;
X    char* parent_children;	/* parent + list of named children */
X    caddr_t unused;		/* call data from widget, not used */
X{
X    CreateKids(w, parent_children, "WcCreateChildrenCB", WcCreateNamedChildren);
X}
X
Xvoid WcCreatePopupsCB ( w, parent_children, unused )
X    Widget w;
X    char* parent_children;      /* parent + list of named children */
X    caddr_t unused;             /* call data from widget, not used */
X{
X    CreateKids(w, parent_children, "WcCreatePopupsCB", WcCreateNamedPopups );
X}
X
Xstatic void CreateKids ( w, parent_children, caller, CreateFunc )
X    Widget w;
X    char* parent_children;      /* parent + list of named children */
X    char* caller;		/* name of calling CB func 	   */
X    PtrFuncVoid CreateFunc;
X{
X    char*	children;
X    Widget	parent;
X
X    if ( *parent_children == NUL ) 
X    {
X	XtWarning(
X            "%s ( ) - Failed \n\
X             Usage: %s ( parent, child [, child ] ...) \n\
X                    Name of parent can be `this' or wildcarded pathname, \n\
X                    Name of child must be single part name from parent. \n\
X             Problem: No widget names provided.",
X		caller, caller);
X	return;
X    }
X
X    children = WcCleanName( parent_children, cleanName );
X
X    children = WcSkipWhitespace_Comma( children );
X
X    if ((Widget)NULL == (parent = WcFullNameToWidget( w, cleanName )) )
X    {
X	sprintf( msg,
X            "%s (%s) - Failed \n\
X             Usage: %s ( parent, child [, child ] ...) \n\
X                    Name of parent can be `this' or wildcarded pathname, \n\
X                    Name of child must be single part name from parent. \n\
X             Problem: Parent widget named `%s' not found.",
X	    caller, parent_children, caller, cleanName);
X	XtWarning( msg );
X	return;
X    }
X
X    if (*children == NUL)
X    {
X        sprintf( msg,
X            "%s (%s) - Failed \n\
X             Usage: %s ( parent, child [, child ] ...) \n\
X                    Name of parent can be `this' or wildcarded pathname, \n\
X                    Name of child must be single part name from parent. \n\
X             Problem: No children names provided.",
X	    caller, parent_children, caller );
X	XtWarning( msg );
X        return;
X    }
X
X    (*CreateFunc) ( parent, children );
X}
X
X/******************************************************************************
X**  Manage or Unmanage named widget(s)
X*******************************************************************************
X    This callback translates string passed in as client data into one or more
X    widget ids, and manages or unmanages it or them.  Client data format:
X	name [, name] ...
X    Name can include `this' and other path names.
X******************************************************************************/
X
X#ifdef FUNCTION_PROTOTYPES
Xstatic void ManageOrUnmanage( Widget, char*, char*, void (*proc)() );
X#else
Xstatic void ManageOrUnmanage();
X#endif
X
Xvoid WcManageCB ( w, widgetNames, unused )
X    Widget w;
X    char* widgetNames;
X    caddr_t unused;		/* call data from widget, not used */
X{
X    ManageOrUnmanage( w, widgetNames, "WcManageCB", XtManageChildren );
X}
X
Xvoid WcUnmanageCB ( w, widgetNames, unused )
X    Widget w;
X    char* widgetNames;
X    caddr_t unused;             /* call data from widget, not used */
X{
X    ManageOrUnmanage( w, widgetNames, "WcUnmanageCB", XtUnmanageChildren );
X}
X
Xstatic void ManageOrUnmanage ( w, widgetNames, callbackName, proc )
X    Widget w;
X    char* widgetNames;
X    char* callbackName;
X    void (*proc)();
X{
X    int         numWidgets = 0;
X    char*       s = widgetNames;
X
X    while (*s && numWidgets < MAX_CHILDREN)
X    {
X        s = WcCleanName ( s, cleanName );
X        s = WcSkipWhitespace_Comma ( s );
X        if ( widget_list[numWidgets] = WcFullNameToWidget ( w, cleanName ) )
X            numWidgets++;
X        else
X        {
X            sprintf(msg,
X            "%s (%s) - Widget `%s' ignored \n\
X             Usage:   %s ( widget_name [, widget_name] ... ) \n\
X             Problem: Could not find widget named `%s'.",
X             callbackName, widgetNames, cleanName, callbackName, cleanName);
X            XtWarning( msg );
X        }
X    }
X    if (numWidgets >= MAX_CHILDREN)
X    {
X	sprintf(msg,
X            "%s (%s) - Failed \n\
X             Usage:   %s ( widget_name [, widget_name] ... ) \n\
X             Problem: Too many widgets (more than MAX_CHILDREN).",
X             callbackName, widgetNames, callbackName);
X	XtWarning( msg );
X	numWidgets = 0;
X    }
X
X    if ( numWidgets )
X        /* proc is either XtManageChildren or XtUnmanageChildren */
X        proc ( widget_list, numWidgets );
X}
X
X/*
X    -- Manage or unamange named children callback
X*******************************************************************************
X    These callbacks translates a string passed in as client data into a parent
X    widget id, and names of children of that parent.  If parent name is
X    `this' then widget invoking callback is used as the parent.  Parent
X    name can also be a wildcarded path name.  Child names must be single
X    part, specific children of the parent. Client data format:
X
X             parent, child [,child] ...
X
X    This callback can be used as an alternate for WcManageCB but it is
X    really intended to be used to manage/unmanage children of widgets 
X    which have multiple instances, and where the parent name is `this'.
X*/
X#ifdef FUNCTION_PROTOTYPES
Xstatic void ManageOrUnmanageChildren( Widget, char*, char*, void (*proc)() );
X#else
Xstatic void ManageOrUnmanageChildren();
X#endif
X
Xvoid WcManageChildrenCB ( w, parent_children, unused )
X    Widget 	w;
X    char*	parent_children;/* client data, list of named children  */
X    caddr_t	unused;		/* call data from widget		*/
X{
X    ManageOrUnmanageChildren( w, parent_children, 
X				"WcManageChildrenCB", XtManageChildren );
X}
X
Xvoid WcUnmanageChildrenCB ( w, parent_children, unused )
X    Widget      w;
X    char*       parent_children;/* client data, list of named children  */
X    caddr_t     unused;         /* call data from widget                */
X{
X    ManageOrUnmanageChildren( w, parent_children,
X                                "WcUnmanageChildrenCB", XtUnmanageChildren );
X}
X
Xstatic void ManageOrUnmanageChildren( w, parent_children, callbackName, proc )
X    Widget w;
X    char* parent_children;      /* client data, list of named children  */
X    char* callbackName;		/* WcManageChildrenCB or WcUnmanageChildrenCB */
X    void (*proc)();		/* XtManageChildren or XtUnmanageChildren */
X{
X    int         	numWidgets = 0;
X    char*		next;
X    Widget		parent;
X
X    if ( *parent_children == NUL )
X    {
X        sprintf(msg,
X            "%s ( ) - Failed \n\
X             Usage: %s ( parent, child [, child ] ...) \n\
X                    Name of parent can be `this' or wildcarded pathname, \n\
X                    Name of child must be single part name from parent. \n\
X             Problem: No widget names provided.",
X	    callbackName, callbackName);
X	XtWarning( msg );
X        return;
X    }
X
X    next = WcCleanName( parent_children, cleanName );
X    if ((Widget)NULL == (parent = WcFullNameToWidget( w, cleanName )) )
X    {
X        sprintf( msg,
X            "%s (%s) - Failed \n\
X             Usage: %s ( parent, child [, child ] ...) \n\
X                    Name of parent can be `this' or wildcarded pathname, \n\
X                    Name of child must be single part name from parent. \n\
X             Problem: Parent widget named `%s' not found.",
X            callbackName, parent_children, callbackName, cleanName);
X        XtWarning( msg );
X        return;
X    }
X
X    while (*next && numWidgets < MAX_CHILDREN)
X    {
X        next = WcCleanName( next, cleanName );
X	if (widget_list[numWidgets] = WcChildNameToWidget( parent, cleanName ))
X	    numWidgets++;
X	else
X	{
X	    sprintf( msg,
X            "%s (%s) - Child `%s' ignored \n\
X             Usage: %s ( parent, child [, child ] ...) \n\
X                    Name of parent can be `this' or wildcarded pathname, \n\
X                    Name of child must be single part name from parent. \n\
X             Problem: Child widget named `%s' not found.",
X	    callbackName, parent_children, callbackName, cleanName);
X	    XtWarning( msg );
X	}
X    }
X
X    if (numWidgets >= MAX_CHILDREN)
X    {
X        sprintf(msg,
X            "%s (%s) - Failed \n\
X             Usage: %s ( parent, child [, child ] ...) \n\
X                    Name of parent can be `this' or wildcarded pathname, \n\
X                    Name of child must be single part name from parent. \n\
X             Problem: Too many widgets (more than MAX_CHILDREN).",
X             callbackName, parent_children, callbackName);
X        XtWarning( msg );
X        numWidgets = 0;
X    }
X
X    if ( numWidgets )
X        /* proc is either XtManageChildren or XtUnmanageChildren */
X        proc ( widget_list, numWidgets );
X}
X
X/*
X    -- Destroy named children callback
X*******************************************************************************
X    This callback translates string passed in as client data into a widget id
X    and destroys it. A comma separated list of widgets can be specified.
X    `this' means the invoking widget.
X*/
X
Xvoid WcDestroyCB ( w, widgetNames, unused )
X    Widget  w;
X    char*   widgetNames;	/* client data, widgets to be destroyed */
X    caddr_t unused;		/* call data from widget, not used	*/
X{
X    int		widget_count = MAX_CHILDREN;
X    char*	unConvertedNames;
X    int         i;
X
X    unConvertedNames = WcNamesToWidgetList ( w, widgetNames, 
X				    widget_list, &widget_count );
X    if ( unConvertedNames[0] != NUL )
X    {
X	sprintf(msg,
X            "WcDestroyCB (%s) \n\
X             Usage: WcDestroyCB ( widget [, widget ] ...) \n\
X                    Name of widget can be `this' or wildcarded pathname. \n\
X		    Problem: No widgets found named %s.",
X             widgetNames, unConvertedNames);
X        XtWarning( msg );
X    }
X
X    for (i=0; i<widget_count; i++)
X       XtDestroyWidget ( widget_list[i] );
X}
X
X/*
X    -- Parse name_res_resVal into name, res, resVal
X*******************************************************************************
X    This is a private function to WcSetValueCB()
X*/
X
Xstatic void 
XParseNameResResVal( name_res_resVal, target_name, resource, res_val )
X    char* name_res_resVal;	/* input */
X    char* target_name;		/* output */
X    char* resource;		/* output */
X    char* res_val;		/* output */
X{
X    register char *d,*s;
X
X    s = name_res_resVal;
X    /* copy from name_res_resVal into target_name[],
X    ** ignore initial whitespace, stop at trailing `:'  
X    ** Then backup to get final segment, the resource name
X    */
X    for ( s = name_res_resVal ; *s && *s <= ' ' ; s++ )
X	;	/* skip initial whitespace */
X    for ( d = target_name ; *s && *s != ':' ; s++, d++ )
X	*d = *s;
X    for ( ; target_name < d && (*d != '.' && *d != '*') ; s--, d-- )
X	;
X    *d = NUL;
X
X    /* OK, now target_name is null terminated.
X    ** s points at final `.' or `*' in name_resName, 
X    ** now we copy to resource[].
X    */
X    for ( s++, d = resource ; *s && *s != ':' ; s++, d++ )
X        *d = *s;
X    *d = NUL;
X
X    /* OK, now resource is null terminated.
X    ** s points at the `:' now we skip whitespace and the rest is value
X    ** until we hit the NUL terminator.
X    */
X    for (s++ ; *s && *s <= ' ' ; s++ )
X        ;       /* skip initial whitespace */
X    for (d = res_val ; *s ; s++, d++ )
X	*d = *s;
X    do
X	*d = NUL;	/* null terminate, delete trailing whitespace */
X    while (*--d <= ' ');
X}
X
X/*
X   -- Set Resource Value on Widget
X*******************************************************************************
X    This callback sets a resource value on the named widget.
X
X    The client data argument has a format:
X
X        target_widget_name.resource_name: resource value
X
X    The special resource value of "this" means "this widget."  Typically,
X    using "this" as the resource value is used to set the "XmNdefaultButton"
X    resource on a XmbulletinBoard, "menuBar", "workArea", etc on XmMainWindows,
X    the subMenuId resource on menuBar cascade buttons, and so on.
X
X    Just about everything this function does is related to providing
X    nice error messages.
X*/
X
Xvoid WcSetValueCB ( w, name_res_resVal, unused )
X    Widget  w;  
X    char*   name_res_resVal;		/* client data: name.resName: resVal */
X    caddr_t unused;			/* call data from wudget, not used   */
X{
X    /* Note: static buffers make this routine NON-REENTRANT!! */
X    static char    target_name[MAX_XRMSTRING];
X    static char    resource[MAX_XRMSTRING];
X    static char    res_val[MAX_XRMSTRING];
X
X    Widget	target;
X    Widget	res_widget;
X    char*	res_type;	/* must be XtFree'd */
X
X    ParseNameResResVal( name_res_resVal, target_name, resource, res_val );
X
X    /* Check for syntax error: if any of the strings are null, wrongo!
X    */
X    if ( target_name[0] == NUL || resource[0] == NUL || res_val[0] == NUL )
X    {
X        char *missing;
X
X        if (target_name[0] == NUL) missing = "target_widget_name";
X        else if (resource[0] == NUL) missing = "res_name";
X        else if (res_val[0] == NUL) missing = "res_value";
X
X        sprintf ( msg,
X            "WcSetValueCB (%s) - Failed \n\
X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
X             Problem: Missing %s argument.",
X            name_res_resVal, missing );
X        XtWarning( msg ); 
X	return;
X    }
X
X    /* See if we can find the target widget */
X    if (! (target = WcFullNameToWidget( w, target_name )) )
X    {
X        sprintf ( msg,
X            "WcSetValueCB (%s)  \n\
X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
X             Problem: Could not find widget named `%s'",
X             name_res_resVal, target_name );
X        XtWarning( msg );
X        return;
X    }
X
X    /* Make certain widget has this resource type */
X    if (! (res_type = WcGetResourceType( target, resource )) )
X    {
X	sprintf ( msg,
X            "WcSetValueCB (%s) - Failed \n\
X             Usage:   WcSetValueCB( target_widget_name.res_name: res_value ) \n\
X             Problem: widget %s does not have a resource named %s.",
X	name_res_resVal, target_name, resource);
X        XtWarning(msg);
X	return;
X    }
X
X    /* Try this heuristic: if the resource type has "Widget" somewhere within
X    ** it, then see if we can convert the resource value to a widget using 
X    ** WcFullNameToWidget.  This allow relative naming from the calling
X    ** widget, including `this' or ^^foobar.
X    ** WcStrStr( res_type, "Widget") returns NULL if "Widget" is not in res_type
X    ** Note that we must check for both "Widget" and "Window" - we should only
X    ** check for "Widget" but Motif has a screwed up definition for the
X    ** menuWidget resource of XmRowColumn widgets.  So, until Motif fixes
X    ** XmRowColumn.h, we need to check for both...
X    */
X    if ( WcStrStr( res_type, "Widget") 
X      || WcStrStr( res_type, "Window") )  /* wrong: but that's a menuWidget */
X    {
X	Widget	res_widget;
X
X	if (res_widget = WcFullNameToWidget( w, res_val ))
X	{
X	    XtVaSetValues( target, resource, res_widget, NULL );
X	    return;
X	}
X    }
X
X    /* We have the type, so do conversion, and then call XtSetValues. */
X
X    WcSetValueFromStringAndType( target, resource, res_val, res_type );
X    XtFree( res_type );
X}
X
X/*
X    -- Parse name_res_resType_resVal into name, res, resType, resVal
X*******************************************************************************
X    This is a private function to WcSetTypeValueCB()  which *must*
X    allocate sufficient space for the return values!
X*/
X
Xstatic void 
XParseNameResResTypeResVal( name_res_resType_resVal, name, res, resType, resVal )
X    char* name_res_resType_resVal;	/* input */
X    char* name;				/* output */
X    char* res;				/* output */
X    char* resType;			/* output */
X    char* resVal;			/* output */
X{
X    register char *d,*s;
X
X    /* copy from name_res_resType_resVal into name[],
X    ** ignore initial whitespace, stop at trailing `:'  
X    ** Then backup to get final segment, the resource name
X    */
X    for ( s = name_res_resType_resVal ; *s && *s <= ' ' ; s++ )
X	;	/* skip initial whitespace */
X    for ( d = name ; *s && *s != ':' ; s++, d++ )
X	*d = *s;
X    for ( ; name < d && (*d != '.' && *d != '*') ; s--, d-- )
X	;
X    *d = NUL;
X
X    /* OK, now name is null terminated.
X    ** s points at final `.' or `*' in name_resName, 
X    ** now we copy to res[].
X    */
X    for ( s++, d = res ; *s && *s != ':' ; s++, d++ )
X        *d = *s;
X    *d = NUL;
X
X    /* OK, now resource is null terminated.
X    ** s points at the `:' now we skip whitespace and the next word is Type.
X    */
X    for (s++ ; *s && *s <= ' ' ; s++ )
X        ;       /* skip initial whitespace */
X    for ( d = resType ; *s && *s > ' ' && *s != ':' && *s != ',' ; s++, d++ )
X	*d = *s;
X    *d = NUL;
X    
X    /* OK, now resType is null terminated.
X    ** s points at the `:' or `,' or whitespace.  Skip whitespace and the 
X    ** rest is resVal until we hit the NUL terminator.
X    */
X    for (s++ ; *s && *s <= ' ' ; s++ )
X        ;       /* skip initial whitespace */
X    for (d = resVal ; *s ; s++, d++ )
X	*d = *s;
X    do
X	*d = NUL;	/* null terminate, delete trailing whitespace */
X    while (*--d <= ' ');
X}
X
X/*
X   -- Set Resource Value on Widget using specific target type info
X*******************************************************************************
X    This callback sets a resource value on the named widget.  It exists
X    so sub-resources can be set.  Specifically, widgets which have
X    non-widget components (XawText and XmText are classic examples)
X    can accept resources which are NOT returned by XtGetResourceList
X    or by XtGetConstraintResourceList.  Probably, this is a bug in
X    the widget's GetValuesHook.
X
X    The client data argument has a format:
X
X        target_widget_name.resource_name: resType, resource value
X
X    The resource type, unfortunately, *must* be the string represented
X    by such constants as XmRString or XtRPixel.  Sorry.
X
X    The special resource value of "this" means "this widget."  Typically,
X    using "this" as the resource value is used to set the "XmNdefaultButton"
X    resource on a XmbulletinBoard, "menuBar", "workArea", etc on XmMainWindows,
X    the subMenuId resource on menuBar cascade buttons, and so on.
X
X    Just about everything this function does is related to providing
X    nice error messages.
X*/
X
Xvoid WcSetTypeValueCB ( w, name_res_resType_resVal, unused )
X    Widget  w;  
X    char*   name_res_resType_resVal;	/* wid.res: type, val	*/
X    caddr_t unused;			/* call data, not used	*/
X{
X    /* Note: static buffers make this routine NON-REENTRANT!! */
X    static char    name   [MAX_XRMSTRING];
X    static char    res    [MAX_XRMSTRING];
X    static char    resType[MAX_XRMSTRING];
X    static char    resVal [MAX_XRMSTRING];
X
X    Widget	target;
X
X    *name = *res = *resType = *resVal = NUL;
X
X    ParseNameResResTypeResVal( name_res_resType_resVal, 
X				name, res, resType, resVal);
X
X    /* Check for syntax error: if any of the strings are null, wrongo!
X    */
X    if ( *name == NUL || *res == NUL || *resType == NUL || *resVal == NUL )
X    {
X        char *missing;
X
X        if (     *name    == NUL) missing = "target_widget";
X        else if (*res     == NUL) missing = "res";
X	else if (*resType == NUL) missing = "resType";
X        else if (*resVal  == NUL) missing = "resVal";
X
X        sprintf ( msg,
X            "WcSetTypeValueCB (%s) - Failed \n\
X             Usage:   WcSetTypeValueCB( target_widget.res: resType, resVal )\n\
X             Problem: Missing %s argument.",
X            name_res_resType_resVal, missing );
X        XtWarning( msg ); 
X	return;
X    }
X
X    /* See if we can find the target widget */
X    if (! (target = WcFullNameToWidget( w, name )) )
X    {
X        sprintf ( msg,
X            "WcSetTypeValueCB (%s)  \n\
X             Usage:   WcSetTypeValueCB( target_widget.res: resType, resVal )\n\
X             Problem: Could not find widget named `%s'",
X             name_res_resType_resVal, name );
X        XtWarning( msg );
X        return;
X    }
X
X    /* Try this heuristic: if the resource type has "Widget" somewhere within
X    ** it, then see if we can convert the resource value to a widget using 
X    ** WcFullNameToWidget.  This allow relative naming from the calling
X    ** widget, including `this' or ^^foobar.
X    ** WcStrStr( res_type, "Widget") returns NULL if "Widget" is not in res_type
X    ** Note that we must check for both "Widget" and "Window" - we should only
X    ** check for "Widget" but Motif has a screwed up definition for the
X    ** menuWidget resource of XmRowColumn widgets.  So, until Motif fixes
X    ** XmRowColumn.h, we need to check for both...
X    */
X    if ( WcStrStr( resType, "Widget") 
X      || WcStrStr( resType, "Window") )  /* wrong: but that's a menuWidget */
X    {
X	Widget	res_widget;
X
X	if (res_widget = WcFullNameToWidget( w, resVal ))
X	{
X	    XtVaSetValues( target, res, res_widget, NULL );
X	    return;
X	}
X    }
X
X    /* We have the type, so do conversion, and then call XtSetValues. */
X
X    WcSetValueFromStringAndType( target, res, resVal, resType );
X}
X
X/*
X    -- Change sensitivity of widgets.
X*******************************************************************************
X    This callback translates string passed in as client data into widget ids
X    and sets each to be sensitve/insensitive. A comma separated list of 
X    widgets can be specified.  `this' means the invoking widget.  
X
X    This callback someday should take care of the problem with text
X    widgets - they don't get grey when insensitive, which must be a bug.
X*/
X
X#ifdef FUNCTION_PROTOTYPES
Xstatic void ChangeSensitivity( Widget, char*, char*, int );
X#else
Xstatic void ChangeSensitivity();
X#endif
X
Xvoid WcSetSensitiveCB ( w, widgetNames, unused )
X    Widget  w;
X    char*   widgetNames;        /* client data, widgets to be destroyed */
X    caddr_t unused;		/* call data from widget is not used    */
X{
X    ChangeSensitivity ( w, widgetNames, "WcSetSensitiveCB", (Boolean)TRUE );
X}
X
Xvoid WcSetInsensitiveCB ( w, widgetNames, unused )
X    Widget  w;
X    char*   widgetNames;        /* client data, widgets to be destroyed */
X    caddr_t unused;             /* call data from widget is not used    */
X{
X    ChangeSensitivity ( w, widgetNames, "WcSetInsensitiveCB", (Boolean)FALSE );
X}
X
Xstatic void ChangeSensitivity ( w, widgetNames, callbackName, sensitive )
X    Widget  w;
X    char*   widgetNames;        /* client data, widgets to be destroyed */
X    char*   callbackName;	/* "WcSetSensitiveCB" or "WcSetInsensitiveCB" */
X    int     sensitive;
X{
X    int    widget_count = MAX_CHILDREN;
X    char*  unConvertedNames;
X    int    i;
X
X    unConvertedNames = WcNamesToWidgetList ( w, widgetNames,
X                                    widget_list, &widget_count );
X    if ( unConvertedNames[0] != NUL )
X    {
X        sprintf(msg,
X            "%s (%s) - One or more widget names ignored \n\
X             Usage: %s ( widget [, widget ] ...) \n\
X                    Name of widget can be `this' or wildcarded pathname. \n\
X                    Problem: No widgets found named %s.",
X             callbackName, widgetNames, callbackName, unConvertedNames);
X        XtWarning( msg );
X    }
X
X    for (i=0; i<widget_count; i++)
X	XtSetSensitive ( widget_list[i], sensitive );
X}
X
X/*
X    -- Load Resource File
X*******************************************************************************
X    This callbacks loads specified resource file into application
X    resource database. It allows to load resources on as-needed
X    basis, reducing the intitial resource file load overhead. 
X    The file to load is specified as client data. The directory search 
X    for the file (should be) the same as for application class resource file.
X    
X    To prevent repeated loads of the same file, the callback keeps
X    track of each filename.  Note that I do not allow a file to be
X    re-loaded even if it is changed, or if a new file of the same 
X    name appears on the search path.  This was done for two reasons:
X    first, it makes the code more portable, as I don't have to depend
X    upon various system calls.  Second, resources can't be un-written,
X    so a user might get the wrong impression that a resource specification
X    can be deleted, and the resource file re-loaded, and something will
X    happen.  It just isn't so.
X
X    NOTE:
X    The file search list rule used here is a gross simplification of the R3
X    resource file search mechanism, without the $LANG provision.
X    I hope I can use R4 soon and do it RIGHT, but I depend on Motif for now,
X    and do not want to duplicate all the Motif code here.
X    Here I look into two directories only, which may be defined as environmental
X    variables:
X         XAPPLRESDIR  - defaults to "/usr/lib/X11/app-defaults/"
X	 XUSERRESDIR  - defaults to HOME directory
X*/
X
Xvoid WcLoadResourceFileCB ( w,  resFileName, unused )
X    Widget w;
X    char*  resFileName;	/* client data, X resources file name */
X    caddr_t unused;	/* call data,   not used */
X{
X    static char		name[MAX_PATHNAME];		/* so not on stack */
X    XrmQuark		nameQ;
X    static XrmQuark	nameQuarks[MAX_RES_FILES];	/* initially all 0 */
X    int			i;
X    XrmDatabase		rdb;
X    Display*		dpy = XtDisplay(w);
X
X    (void) WcCleanName( resFileName, name );
X
X/*  -- check pathname presence */
X    if ( *name == NUL )
X    {
X        XtWarning ( 
X            "WcLoadResourceFileCB () - Failed \n\
X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
X             Problem: No file name provided.");
X        return;
X    }
X
X/*  -- check for repeated load, remember if first load */
X    nameQ = XrmStringToQuark( name );
X    i = 0;
X    while ( nameQuarks[i] && i < MAX_RES_FILES )
X    {
X	if ( nameQuarks[i] == nameQ )
X	    return;			/* NB: not an error, its even common */
X	else
X	    i++;
X    }
X    nameQuarks[i] = nameQ;
X
X/*  -- See if filename is an absolute pathname from root `/' */
X    if ( '/' == name[0] )
X    {
X	if ((rdb = XrmGetFileDatabase( name )) != NULL )
X	    XrmMergeDatabases (rdb, &(dpy->db) );
X	else
X	{
X	    sprintf( msg,
X            "WcLoadResourceFileCB (%s) - Failed \n\
X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
X             Problem: file %s is not a readable file.", 
X	    resFileName, name );
X	    XtWarning( msg );
X	}
X	return;
X    }
X
X/*  -- See if filename is a pathname from tilda */
X    if ( '~' == name[0] )
X    {
X	char* homeDir;
X	char  path[ MAX_PATHNAME ];
X	char  user[ MAX_PATHNAME ];
X	char* from = &name[1];		/* skip the tilda */
X	char* to   = &user[0];
X
X	while (*from && *from != '/')
X	    *to++ = *from++;
X	*to = '\0';
X
X	/* NB: `user' now contains either a NUL, or the characters 
X	** between the `~' and the first `/`.  `from' now points into 
X	** `name' after the `~user', right at the `/` 
X	*/
X
X	homeDir = HomeDirectory( user );
X
X	if( strlen(homeDir) + strlen(from) >= MAX_PATHNAME )
X	{
X	    sprintf( msg,
X            "WcLoadResourceFileCB (%s) - Failed \n\
X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
X             Problem: file %s becomes too long when expanded.",
X            resFileName, name );
X            XtWarning( msg );
X	    return;
X	}
X
X	strcpy( path, homeDir );
X	strcat( path, from );
X
X	if ((rdb = XrmGetFileDatabase( path )) != NULL )
X	    XrmMergeDatabases (rdb, &(dpy->db) );
X        else
X        {
X            sprintf( msg,
X            "WcLoadResourceFileCB (%s) - Failed \n\
X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
X             Problem: file %s is not a readable file.",
X            resFileName, path );
X            XtWarning( msg );
X        }
X        return;
X    }
X
X/*  -- Look for file in current working directory.
X**     Note this handles when name begins with `.'
X*/
X
X    if ((rdb = XrmGetFileDatabase(name)) != NULL )
X    {
X        XrmMergeDatabases (rdb, &(dpy->db) );
X        return;
X    }
X
X
X#ifdef XtSpecificationRelease
X    {
X	/* Use XUSERFILESEARCHPATH, user's home directory, and XAPPLRESDIR 
X	** in the same way that XtR4 does when it gets user's application 
X	** defaults.  This code basically mimics GetAppUserDefaults() in 
X	** mit/lib/Xt/Initialize.c of the X11R4 distribution.  The main
X	** difference is that this routine uses the filename argument `name' 
X	** instead of the application class name.
X	*/
X	char* filename;
X	char* path;
X	char* xUserFileSearchPath = getenv("XUSERFILESEARCHPATH");
X
X	if (xUserFileSearchPath)
X	    path = xUserFileSearchPath;
X	else
X	    path = DefaultUserSearchPath( THIS_USER );
X
X	filename = XtResolvePathname(
X		dpy,			/* could be used for language	*/
X		"apps-defaults",	/* type, used as sub-directory	*/
X		name,			/* file name			*/
X		NULL,			/* no file name suffix		*/
X		path,			/* search path, may be NULL	*/
X		NULL, 0,		/* no additional path substitutions */
X		NULL );			/* if the file exists, is readable,
X					** and not a directory, its OK	    */
X	if ((rdb = XrmGetFileDatabase(filename)) != NULL )
X	{
X	    XrmMergeDatabases (rdb, &(dpy->db) );
X	    return;
X	}
X    }
X
X#else
X    {
X	/* For Motif 1.0, do something really simple and stupid.  Look for the
X	** file in XAPPLRESDIR which is defined in the user's environment, or 
X	** in XAPPLOADDIR, the site defined directory for applcation defaults 
X	** (commonly /usr/lib/X11/app-defaults
X	*/
X	char  filename[ MAX_PATHNAME ];
X	char* path = getenv("XAPPLRESDIR");
X
X        if ( NULL == path )
X	    path = XAPPLOADDIR;
X
X        if( strlen(path) + strlen(name) >= MAX_PATHNAME )
X        {
X            sprintf( msg,
X            "WcLoadResourceFileCB (%s) - Failed \n\
X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
X             Problem: file %s becomes too long when \n\
X                      prepended with %s.",
X            resFileName, name, path );
X            XtWarning( msg );
X            return;
X        }
X
X        strcpy ( filename, path );
X        strcat ( filename, name );
X
X        if ((rdb = XrmGetFileDatabase(filename)) != NULL )
X        {
X	    XrmMergeDatabases (rdb, &(dpy->db) );
X	    return;
X        }	
X    }
X#endif
X
X/*  -- warn the user if no file found */
X    sprintf  ( msg, 
X            "WcLoadResourceFileCB (%s) - Failed \n\
X             Usage:   WcLoadResourceFileCB( resource_file_name ) \n\
X             Problem: Cannot find resource file %s",
X	resFileName, name );
X    XtWarning( msg );
X}
X
X/*
X  -- WcTraceCallback
X*******************************************************************************
X    This is a simple traceback callback, used to assist in interface
X    debugging. The callback prints the invoking wiget pathname and
X    a specified message on std. output.
X*/
X
Xvoid WcTraceCB ( w, annotation, unused )
X    Widget w;
X    char* annotation;	/* client data, traceback annotation */
X    caddr_t unused;	/* call data,   not used */
X{
X    char* name = WcWidgetToFullName( w );
X    
X    printf("TraceCB for %s: %s\n", name, annotation );
X    XtFree( name );
X}
X
X/*
X  -- Popup named widget
X*******************************************************************************
X    These callbacks translate a string passed in as client data into a 
X    widget id.  
X
X    A grab kind value of XtGrabNone has the effect of allowing 
X    non-modal popups.  This is the preferred type: rarely use modal pop-ups.
X    This is registered as PopupCB.
X
X    A grab kind value of XtGrabExclusive has the effect of grabbing all
X    application events, allowing modal popups.  This is registered as 
X    PopupGrabCB.
X*/
X
X#ifdef FUNCTION_PROTOTYPES
Xstatic void Popup ( Widget, char*, char*, XtGrabKind );
X#else
Xstatic void Popup ();
X#endif
X
Xvoid WcPopupCB ( w, name, unused )
X    Widget      w;
X    char*       name;
X    caddr_t	unused;
X{
X    Popup ( w, name, "WcPopupCB", XtGrabNone );
X}
X
Xvoid WcPopupGrabCB ( w, name, unused )
X    Widget      w;
X    char*       name;
X    caddr_t     unused;
X{
X    Popup ( w, name, "WcPopupGrabCB", XtGrabExclusive );
X}
X
Xstatic void Popup ( w, name, callbackName, grab )
X    Widget	w;
X    char*	name;
X    char*	callbackName;
X    XtGrabKind	grab;
X{
X    Widget      widget;
X
X    (void)WcCleanName ( name, cleanName );
X    widget = WcFullNameToWidget ( w, cleanName );
X
X    if (XtIsShell(widget))
X    {
X        XtPopup  ( widget, grab );
X    }
X    else
X    {
X        sprintf( msg,
X            "%s (%s) - Failed \n\
X             Usage: %s (shell_widget_name) \n\
X             Problem: `%s' is not a shell widget.",
X             callbackName, name, callbackName, cleanName);
X        XtWarning( msg );
X    }
X}
X
X/*
X  -- Popdown named widget
X*******************************************************************************
X    This callback translates string passed in as client data into a widget id
X    and pops-down a popup shell widget.
X*/
X
Xvoid WcPopdownCB ( w, name, unused ) 
X    Widget	w;
X    char*	name;
X    caddr_t	unused;
X{
X    Widget      widget;
X
X    (void)WcCleanName ( name, cleanName );
X    widget = WcFullNameToWidget ( w, cleanName );
X
X    if (XtIsShell(widget))
X    {
X        XtPopdown  ( widget );
X    }
X    else
X    {
X        sprintf( msg,
X            "WcPopdownCB (%s) Failed \n\
X             Usage: WcPopdownCB (shell_widget_name) \n\
X             Problem: `%s' is not a shell widget.",
X             name, cleanName);
X        XtWarning( msg );
X    }
X}
X
X/*
X  -- Map and Unmap named widget
X*******************************************************************************
X    These callbacks translate a string passed as client data into a widget id
X    and invokes either XtMapWidget() os XtUnmapWidget() as appropriate.
X*/
X
Xvoid WcMapCB (w, name, unused )
X    Widget      w;
X    char*       name;
X    caddr_t     unused;
X{
X    Widget      widget;
X
X    (void)WcCleanName ( name, cleanName );
X    widget = WcFullNameToWidget ( w, cleanName );
X
X    if (XtIsShell(widget))
X    {
X        XtMapWidget ( widget );
X    }
X    else
X    {
X        sprintf( msg,
X            "WcMapCB (%s) Failed \n\
X             Usage: WcMapCB (shell_widget_name) \n\
X             Problem: `%s' is not a shell widget.",
X             name, cleanName);
X        XtWarning( msg );
X    }
X}
X
Xvoid WcUnmapCB (w, name, unused )
X    Widget      w;
X    char*       name;
X    caddr_t     unused;
X{
X    Widget      widget;
X
X    (void)WcCleanName ( name, cleanName );
X    widget = WcFullNameToWidget ( w, cleanName );
X
X    if (XtIsShell(widget))
X    {
X        XtUnmapWidget ( widget );
X    }
X    else
X    {
X        sprintf( msg,
X            "WcUnmapCB (%s) Failed \n\
X             Usage: WcUnmapCB (shell_widget_name) \n\
X             Problem: `%s' is not a shell widget.",
X             name, cleanName);
X        XtWarning( msg );
X    }
X}
X
X/*
X  -- Invoke shell command
X*******************************************************************************
X    Call system().
X*/
X
Xvoid WcSystemCB ( w, shellCmdString, unused )
X    Widget      w;
X    char*       shellCmdString;
X    caddr_t     unused;
X{
X    system( shellCmdString );
X}
X
X/*
X  -- Exit the application
X*******************************************************************************
X    Call exit().
X*/
X
Xvoid WcExitCB ( w, exitValString, unused )
X    Widget	w;
X    char*	exitValString;
X    caddr_t	unused;
X{
X    int exitval = 0;
X
X    /* skip leading garbage before int */
X    while (*exitValString)
X    {
X        if ('0' < *exitValString && *exitValString <= '9')
X            break; /* found numbers, convert to exitval */
X        exitValString++;
X    }
X
X    /* convert to int */
X    while (*exitValString)
X    {
X        if ('0' < *exitValString && *exitValString <= '9')
X        {
X            exitval = exitval * 10 + (*exitValString - '0');
X            exitValString++;
X        }
X        else
X            break;  /* ignore trailing garbage */
X    }
X
X    exit( exitval );
X}
X
X/*
X  -- WcRegisterCreateCallbacks
X*******************************************************************************
X   Convenience routine, registering all standard callbacks in one application
X   call.   Called from WcWidgetCreation(), so application usually never needs
X   to call this.
X*/
X
Xvoid WcRegisterWcCallbacks ( app )
XXtAppContext app;
X{
X    ONCE_PER_XtAppContext( app );
X
X#define RCALL( name, func ) WcRegisterCallback ( app, name, func, NULL )
X
X    RCALL( "WcCreateChildrenCB",	WcCreateChildrenCB	);
X    RCALL( "WcCreatePopupsCB",		WcCreatePopupsCB	);
X    RCALL( "WcManageCB",		WcManageCB		);
X    RCALL( "WcUnmanageCB",		WcUnmanageCB		);
X    RCALL( "WcManageChildrenCB",	WcManageChildrenCB	);
X    RCALL( "WcUnmanageChildrenCB",	WcUnmanageChildrenCB	);
X    RCALL( "WcDestroyCB",		WcDestroyCB		);
X    RCALL( "WcSetValueCB",		WcSetValueCB		);
X    RCALL( "WcSetTypeValueCB",		WcSetTypeValueCB	);
X    RCALL( "WcSetSensitiveCB",		WcSetSensitiveCB	);
X    RCALL( "WcSetInsensitiveCB",	WcSetInsensitiveCB	);
X    RCALL( "WcLoadResourceFileCB",	WcLoadResourceFileCB	);
X    RCALL( "WcTraceCB",			WcTraceCB		);
X    RCALL( "WcPopupCB",			WcPopupCB		);
X    RCALL( "WcPopupGrabCB",		WcPopupGrabCB		);
X    RCALL( "WcPopdownCB",		WcPopdownCB		);
X    RCALL( "WcMapCB",			WcMapCB			);
X    RCALL( "WcUnmapCB",			WcUnmapCB		);
X    RCALL( "WcSystemCB",		WcSystemCB		);
X    RCALL( "WcExitCB",			WcExitCB		);
X}
END_OF_FILE
if test 46686 -ne `wc -c <'xrainbow/Wc1_05/Wc/WcCallb.c'`; then
    echo shar: \"'xrainbow/Wc1_05/Wc/WcCallb.c'\" unpacked with wrong size!
fi
# end of 'xrainbow/Wc1_05/Wc/WcCallb.c'
fi
if test -f 'xrainbow/X11/Xaw_d/DrawingAP.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/X11/Xaw_d/DrawingAP.h'\"
else
echo shar: Extracting \"'xrainbow/X11/Xaw_d/DrawingAP.h'\" \(1365 characters\)
sed "s/^X//" >'xrainbow/X11/Xaw_d/DrawingAP.h' <<'END_OF_FILE'
X/* DrawingArea Private 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#ifndef _XawDrawingAreaP_h
X#define _XawDrawingAreaP_h
X
X#include "DrawingA.h"
X#ifdef X11_R3
X#include <X11/SimpleP.h>
X#else
X#include <X11/Xaw/SimpleP.h>
X#endif
X
X/* The drawing area's contribution to the class record */
Xtypedef struct _DrawingAreaClassPart {
X  int ignore;
X} DrawingAreaClassPart;
X
X/* Drawing area's full class record */
Xtypedef struct _DrawingAreaClassRec {
X    CoreClassPart	core_class;
X    SimpleClassPart	simple_class;
X    DrawingAreaClassPart drawing_area;
X} DrawingAreaClassRec;
X
Xextern DrawingAreaClassRec drawingAreaClassRec;
X
X/* Resources added and status of drawing area widget */
Xtypedef struct _XsDrawingAreaPart {
X  /* Resources */
X  XtCallbackList	expose_callback;
X  XtCallbackList	input_callback;
X  XtCallbackList	motion_callback;
X  XtCallbackList	resize_callback;
X} DrawingAreaPart;
X
X
X/* Drawing area's instance record */
Xtypedef struct _DrawingAreaRec {
X    CorePart         core;
X    SimplePart	     simple;
X    DrawingAreaPart  drawing_area;
X} DrawingAreaRec;
X
X#endif /* _XawDrawingAreaP_h */
END_OF_FILE
if test 1365 -ne `wc -c <'xrainbow/X11/Xaw_d/DrawingAP.h'`; then
    echo shar: \"'xrainbow/X11/Xaw_d/DrawingAP.h'\" unpacked with wrong size!
fi
# end of 'xrainbow/X11/Xaw_d/DrawingAP.h'
fi
if test -f 'xrainbow/X11/Xaw_d/Imakefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/X11/Xaw_d/Imakefile'\"
else
echo shar: Extracting \"'xrainbow/X11/Xaw_d/Imakefile'\" \(217 characters\)
sed "s/^X//" >'xrainbow/X11/Xaw_d/Imakefile' <<'END_OF_FILE'
X/**/#
X/**/#   Imakefile for Xaw_d : Dave Nedde (daven at wpi.wpi.edu)
X/**/#
X
X        INCROOT = ../..
X           SRCS = DrawingA.c
X
XNormalLibraryTarget(Xaw_d,DrawingA.o)
X
XDependTarget()
X
XLintLibraryTarget(Xaw_d,$(SRCS))
X
END_OF_FILE
if test 217 -ne `wc -c <'xrainbow/X11/Xaw_d/Imakefile'`; then
    echo shar: \"'xrainbow/X11/Xaw_d/Imakefile'\" unpacked with wrong size!
fi
# end of 'xrainbow/X11/Xaw_d/Imakefile'
fi
if test ! -d 'xrainbow/include/Wc' ; then
    echo shar: Creating directory \"'xrainbow/include/Wc'\"
    mkdir 'xrainbow/include/Wc'
fi
if test ! -d 'xrainbow/include/X11' ; then
    echo shar: Creating directory \"'xrainbow/include/X11'\"
    mkdir 'xrainbow/include/X11'
fi
if test ! -d 'xrainbow/include/X11/Xaw_d' ; then
    echo shar: Creating directory \"'xrainbow/include/X11/Xaw_d'\"
    mkdir 'xrainbow/include/X11/Xaw_d'
fi
if test ! -d 'xrainbow/main' ; then
    echo shar: Creating directory \"'xrainbow/main'\"
    mkdir 'xrainbow/main'
fi
if test -f 'xrainbow/main/patchlevel.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'xrainbow/main/patchlevel.h'\"
else
echo shar: Extracting \"'xrainbow/main/patchlevel.h'\" \(21 characters\)
sed "s/^X//" >'xrainbow/main/patchlevel.h' <<'END_OF_FILE'
X#define PATCHLEVEL 0
END_OF_FILE
if test 21 -ne `wc -c <'xrainbow/main/patchlevel.h'`; then
    echo shar: \"'xrainbow/main/patchlevel.h'\" unpacked with wrong size!
fi
# end of 'xrainbow/main/patchlevel.h'
fi
echo shar: End of archive 2 \(of 5\).
cp /dev/null ark2isdone
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