home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
x
/
volume15
/
olvwm-3.0
/
part20
< prev
next >
Wrap
Internet Message Format
|
1992-02-03
|
59KB
Path: uunet!sun-barr!ames!pasteur!nntp
From: scott.oaks@East.Sun.COM (Scott Oaks)
Newsgroups: comp.sources.x
Subject: v15i166: OpenLook Virtual Window Mgr (3.0), Part20/21
Message-ID: <1992Feb4.140114.8411@pasteur.Berkeley.EDU>
Date: 4 Feb 92 14:01:14 GMT
References: <csx-15i147-olvwm-3.0@uunet.UU.NET>
Sender: dcmartin@msi.com (David C. Martin - Moderator)
Organization: University of California, at Berkeley
Lines: 2103
Approved: dcmartin@msi.com
Nntp-Posting-Host: postgres.berkeley.edu
Submitted-by: scott.oaks@East.Sun.COM (Scott Oaks)
Posting-number: Volume 15, Issue 166
Archive-name: olvwm-3.0/part20
# This is a shell archive. Remove anything before this line, then feed it
# into a shell via "sh file" or similar. To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# If this archive is complete, you will see the following message at the end:
# "End of archive 20 (of 21)."
# Contents: Makefile.sunpro WinInfo.c defaults.c environ.h globals.h
# i18n.c iconimage.h iconmask.h mem.c olgx_impl.h properties.h
# screen.h slave.c virtual.h winbusy.c
# Wrapped by dcmartin@fascet on Tue Jan 14 05:54:49 1992
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'Makefile.sunpro' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'Makefile.sunpro'\"
else
echo shar: Extracting \"'Makefile.sunpro'\" \(3103 characters\)
sed "s/^X//" >'Makefile.sunpro' <<'END_OF_FILE'
X.KEEP_STATE:
X
X# Set this to the directory to place the olvwm executable
XINSTALLDIR = ${OPENWINHOME}/bin
X
X# If you want to use the OPENWINDOWS help facility, then set HELPDIR
X# to the directory where those files are kept. If you cannot write
X# to that directory but still want to install the helpfile, set HELPDIR
X# to some other directory and add that directory to your HELPPATH.
X# If you don't want to install the help file at all, set HELPDIR to /dev/null.
XHELPDIR = ${OPENWINHOME}/lib/info
X
X# Where to install the man pages: man1 dir is where olvwm.man will go;
X# and man5 dir is where olvwmrc.man will go; youmay want to set these
X# to a local directory somewhere.
X# If you don't want to install the man pages, set MAN?DIR to /dev/null.
X
XMAN1DIR = ${OPENWINHOME}/man/man1
XMAN5DIR = ${OPENWINHOME}/man/man5
X
X# If you don't have olwm installed anywhere and want to install the olwm
X# man page (which discusses most of the olvwm functionality too) uncomment
X# out the following lines
X#OLWMMAN = olwm.man
X
X# Set this to the debugging options you'd like
XDEBUG = -O
X
X#
X# You shouldn't need to change anything below this line
X
XINC = -I${OPENWINHOME}/include
XCFLAGS = ${INC} ${DEBUG} -DOW_I18N_L3 -DSUNDAE -DSHAPE
X
XHEADERS = cmdstream.h defaults.h environ.h events.h gettext.h \
X globals.h group.h helpcmd.h i18n.h iconimage.h iconmask.h \
X kbdfuncs.h list.h mem.h menu.h notice.h olcursor.h \
X olgx_impl.h ollocale.h olwm.h patchlevel.h properties.h \
X resources.h screen.h slots.h st.h virtual.h win.h
X
XSRCS = Debug.c Error.c Notice.c Select.c WinInfo.c atom.c client.c \
X cmdstream.c defaults.c environ.c evbind.c events.c gettext.c \
X group.c helpsend.c i18n.c kbdfuncs.c list.c mem.c menu.c \
X moveresize.c olwm.c properties.c resources.c screen.c services.c \
X slave.c slots.c st.c states.c usermenu.c usleep.c virtual.c \
X win.c winbusy.c winbutton.c wincolor.c winframe.c wingframe.c \
X winicon.c winipane.c winmenu.c winnofoc.c winpane.c winpinmenu.c \
X winpush.c winresize.c winroot.c olvwmrc.c images.c \
X ol_button.c
X
XLDFLAGS = -L${OPENWINHOME}/lib
XLIBS = ${LDFLAGS} -lolgx -lX11 -lXext -ll -lm
X
XOBJS = ${SRCS:.c=.o} version.o
X
Xolvwm : ${OBJS}
X cc -o olvwm ${OBJS} ${LIBS}
X
Xversion.c : ${SRCS} ${HEADERS}
X @echo -n "#ident \"@(#)olvwm version compiled " > version.c
X @/bin/sh -c 'echo `date` \"' >> version.c
X
Xparse.c : parse.l
X lex -t parse.l > parse.c
X
Xolvwmrc.c : olvwmrc.y
X yacc olvwmrc.y
X mv y.tab.c olvwmrc.c
X
Xolvwmrc.o : parse.c olvwmrc.c
X
Xclean :
X /bin/rm -f olvwm .make.state .nse_depinfo version.c parse.c olvwmrc.c *.o core errs ,* .emacs_* tags TAGS make.log MakeOut "#"*
X
Xinstall:
X @echo "Installing olvwm in $(INSTALLDIR)"
X @/bin/cp olvwm $(INSTALLDIR)
X @echo "Installing help file in $(HELPDIR)"
X @/bin/cp olvwm.info $(HELPDIR)
X @echo "Installing olvwm man page in $(MAN1DIR)"
X @/bin/cp olvwm.man olvwm.1
X @/bin/cp olvwm.1 $(MAN1DIR)
X @/bin/rm -f olvwm.1
X @echo "Installing olvwmrc man page in $(MAN5DIR)"
X @/bin/cp olvwmrc.man olvwmrc.5
X @/bin/cp olvwmrc.5 $(MAN5DIR)
X @/bin/rm -f olvwmrc.5
X -@/bin/cp ${OLWMMAN} ${MAN1DIR}/olwm.1 >/dev/null 2>&1
END_OF_FILE
if test 3103 -ne `wc -c <'Makefile.sunpro'`; then
echo shar: \"'Makefile.sunpro'\" unpacked with wrong size!
fi
# end of 'Makefile.sunpro'
fi
if test -f 'WinInfo.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'WinInfo.c'\"
else
echo shar: Extracting \"'WinInfo.c'\" \(3093 characters\)
sed "s/^X//" >'WinInfo.c' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)WinInfo.c 1.1 olvwm version 1/3/92"
X
X/*
X * Based on
X#ident "@(#)WinInfo.c 26.5 91/09/14 SMI"
X *
X */
X
X#include <errno.h>
X#include <stdio.h>
X#include <memory.h>
X#include <X11/Xos.h>
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <X11/Xatom.h>
X
X#include "i18n.h"
X#include "olwm.h"
X#include "win.h"
X#include "st.h"
X#include "mem.h"
X
Xst_table *wiHashTable;
Xst_table *vHashTable;
X
Xstatic int
XwiCompare( w1, w2 )
Xregister char *w1, *w2;
X{
X return ((Window)w1) - ((Window)w2);
X}
X
Xstatic int
XwiHash( w1, modulus )
X register char *w1;
X register int modulus;
X{
X return ((Window)w1) % modulus;
X}
X
X/*
X * initialize the hash tables
X * returns: True - success
X * False - failure
X */
X/*ARGSUSED*/ /* dpy arg will be used when multiple Displays supported */
XWIInit( dpy )
XDisplay *dpy;
X{
X wiHashTable = st_init_table(wiCompare, wiHash);
X vHashTable = st_init_table(wiCompare, wiHash);
X}
X
X/*
X * Save window information with the associated window, for later dispatch
X */
Xvoid
XWIInstallInfo(info)
XWinGeneric *info;
X{
X if (WIGetInfo(info->core.self) != NULL)
X {
X ErrorGeneral(
X gettext("Tried to duplicate-register a window -- bailing"));
X }
X st_insert(wiHashTable, (int)info->core.self, (char *)info);
X}
X
Xvoid
XVInstallInfo(info)
XWinGeneric *info;
X{
X if (VGetInfo(info->core.virtual) != NULL)
X ErrorGeneral(gettext("Tried to duplicate register a virtual window"));
X st_insert(vHashTable, (int) info->core.virtual, (char *) info);
X}
X
X/*
X * delete storage for window information
X * returns: True - window entry deleted
X * False - window entry not found
X */
XBool
XWIUninstallInfo(win)
XWindow win;
X{
X WinGeneric *oldInfo;
X Window tmpWin = win;
X Window *tmpWinPtr = &tmpWin;
X int ret;
X
X ret = (st_delete(wiHashTable, (char *)tmpWinPtr, (char *)&oldInfo));
X /*
X * We could have a corresponding VUninstallInfo, but it's easier
X * to do it here -- just make sure there is a virtual window
X */
X if (oldInfo) {
X if (tmpWin = oldInfo->core.virtual)
X st_delete(vHashTable, (char *)tmpWinPtr, (char *)&oldInfo);
X }
X return ret;
X}
X
X/*
X * delete storage for window information
X * returns: True - window entry deleted
X * False - window entry not found
X */
XBool
XVIUninstallInfo(win)
XWindow win;
X{
X WinGeneric *oldInfo;
X Window tmpWin = win;
X Window *tmpWinPtr = &tmpWin;
X
X return st_delete(vHashTable, (char *)tmpWinPtr, (char *)&oldInfo);
X}
X
X/*
X * retrieve information associated with a window
X * returns: Pointer to WinGeneric struct if window is found
X * NULL if not found
X */
XWinGeneric *
XWIGetInfo(win)
XWindow win;
X{
X WinGeneric *winInfo = NULL;
X
X st_lookup(wiHashTable, win, &winInfo);
X return winInfo;
X}
X
XWinGeneric *
XVGetInfo(win)
XWindow win;
X{
X WinGeneric *winInfo = NULL;
X
X st_lookup(vHashTable, win, &winInfo);
X return winInfo;
X}
X
X/*
X * apply a function to all windows
X */
Xvoid
XWIApply(f,c)
Xenum st_retval (*f)();
Xvoid *c;
X{
X st_foreach(wiHashTable, f, c);
X}
END_OF_FILE
if test 3093 -ne `wc -c <'WinInfo.c'`; then
echo shar: \"'WinInfo.c'\" unpacked with wrong size!
fi
# end of 'WinInfo.c'
fi
if test -f 'defaults.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'defaults.c'\"
else
echo shar: Extracting \"'defaults.c'\" \(3863 characters\)
sed "s/^X//" >'defaults.c' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)defaults.c 26.11 91/09/14 SMI"
X
X#ifdef SYSV
X#include <sys/types.h>
X#include <unistd.h>
X#endif
X
X#include <ctype.h>
X#include <errno.h>
X#include <stdio.h>
X#ifdef SYSV
X#include <string.h>
X#else
X#include <strings.h>
X#endif
X#include <sys/file.h>
X#include <X11/Xos.h>
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <X11/Xatom.h>
X#include <X11/Xresource.h>
X
Xchar *getenv();
X
X#include "i18n.h"
X#include "ollocale.h"
X#include "olwm.h"
X#include "defaults.h"
X#include "globals.h"
X#include "resources.h"
X
Xextern char *ProgramName;
X
X/* private data */
Xstatic void parseResourceDefaults();
Xstatic void parseApplicationDefaults();
X
X/*
X * GetDefaults - Set up global OlwmDB with built-in default values.
X * Then, initialize all the appropriate olwm variables
X * using the information in the OlwmDB
X */
Xvoid
XGetDefaults(dpy, commandlineDB)
XDisplay *dpy;
XXrmDatabase commandlineDB;
X{
X /* put resource settings from default files into global OlwmDB */
X parseApplicationDefaults();
X parseResourceDefaults( dpy );
X
X /* merge command line options last into global OlwmDB
X * notice that commandlineDB is destroyed by this call!
X */
X if ( commandlineDB != NULL )
X (void) XrmMergeDatabases( commandlineDB, &OlwmDB );
X
X InitGlobals(dpy);
X}
X
X
X/*
X * parseApplicationDefaults - get resource settings from application
X * default file
X */
Xstatic void
XparseApplicationDefaults()
X{
X XrmDatabase applicationDB = NULL;
X char filename[1024];
X char *openWinPath;
X Bool notFound = False;
X
X /* look for application default file */
X if ( (openWinPath = getenv( "OPENWINHOME" )) != NULL )
X {
X (void) strcpy( filename, openWinPath );
X (void) strcat( filename, "/lib/app-defaults/" );
X (void) strcat( filename, ProgramName );
X if ( access( filename, R_OK ) != 0 )
X notFound = True;
X }
X else
X notFound = True;
X
X if ( notFound )
X {
X (void) strcpy( filename, "/usr/lib/X11/app-defaults/" );
X (void) strcat( filename, ProgramName );
X }
X
X applicationDB = XrmGetFileDatabase( filename );
X if ( applicationDB != NULL )
X (void) XrmMergeDatabases( applicationDB, &OlwmDB );
X}
X
X/*
X * parseResourceDefaults - get resource settings from default user locations.
X * Look first for server property - if it's there, use it alone.
X * If it's not there, look for XENVIRONMENT file and use it.
X * If still no luck, use $HOME/.Xdefaults.
X */
Xstatic void
XparseResourceDefaults( dpy )
XDisplay *dpy;
X{
X XrmDatabase serverDB = NULL, homeDB = NULL;
X char filename[1024];
X unsigned long nitems, remain;
X char *resourceString;
X char *environmentFile;
X
X /* look for RESOURCE_MANAGER property on root window of screen 0 */
X resourceString = GetWindowProperty(dpy, RootWindow(dpy, 0),
X XA_RESOURCE_MANAGER, 0L, 100000000L,
X /* REMIND what should the length really be ? */
X XA_STRING, 0, &nitems, &remain);
X if ((resourceString != NULL) && (nitems != 0))
X {
X serverDB = XrmGetStringDatabase( resourceString );
X (void) XrmMergeDatabases( serverDB, &OlwmDB );
X XFree( resourceString );
X return;
X }
X
X /* if unsuccessful, look for user defaults:
X * first try XENVIRONMENT, next in $HOME/.Xdefaults
X */
X if ( ( (environmentFile = getenv( "XENVIRONMENT" )) == NULL )
X || ( access( environmentFile, R_OK ) != 0 ) )
X {
X if ( (environmentFile = getenv( "HOME" )) != NULL )
X {
X (void) strcpy( filename, environmentFile );
X (void) strcat( filename, "/" );
X (void) strcat( filename, ".Xdefaults" );
X environmentFile = filename;
X }
X }
X if ( environmentFile != NULL )
X {
X homeDB = XrmGetFileDatabase( environmentFile );
X (void) XrmMergeDatabases( homeDB, &OlwmDB );
X }
X return;
X}
END_OF_FILE
if test 3863 -ne `wc -c <'defaults.c'`; then
echo shar: \"'defaults.c'\" unpacked with wrong size!
fi
# end of 'defaults.c'
fi
if test -f 'environ.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'environ.h'\"
else
echo shar: Extracting \"'environ.h'\" \(279 characters\)
sed "s/^X//" >'environ.h' <<'END_OF_FILE'
X/*
X * (c) Copyright 1990 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)environ.h 1.5 91/09/14 SMI"
X
Xextern char **MakeEnviron(/* ScreenInfo *scrInfo */);
END_OF_FILE
if test 279 -ne `wc -c <'environ.h'`; then
echo shar: \"'environ.h'\" unpacked with wrong size!
fi
# end of 'environ.h'
fi
if test -f 'globals.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'globals.h'\"
else
echo shar: Extracting \"'globals.h'\" \(4138 characters\)
sed "s/^X//" >'globals.h' <<'END_OF_FILE'
X/*
X * (c) Copyright 1990 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)globals.h 1.1 olvwm version 1/3/92"
X
X/*
X * Based on
X#ident "@(#)globals.h 26.26 91/10/04 SMI"
X *
X */
X
X#include "list.h"
X
Xtypedef struct {
X unsigned int modmask;
X KeyCode keycode;
X} KeySpec;
X
Xtypedef enum { BeepAlways, BeepNever, BeepNotices } BeepStatus;
X
Xtypedef enum { KbdSunView, KbdBasic, KbdFull } MouselessMode;
X
Xtypedef enum { GridNone, GridInvisible, GridVisible } VirtualGridType;
X
Xtypedef enum { UseNone, UseVDM, UseAll } ImageType;
X
Xtypedef struct _globalResourceVariables {
X char *WorkspaceColor;
X char *WindowColor;
X char *ForegroundColor;
X char *BackgroundColor;
X char *BorderColor;
X Bool ReverseVideo;
X Bool PaintWorkspace;
X Bool F3dUsed;
X Bool F3dFrames;
X Bool F3dResize;
X XFontStruct *TitleFontInfo;
X XFontStruct *TextFontInfo;
X XFontStruct *ButtonFontInfo;
X XFontStruct *IconFontInfo;
X XFontStruct *GlyphFontInfo;
X Cursor BasicPointer;
X Cursor MovePointer;
X Cursor BusyPointer;
X Cursor IconPointer;
X Cursor ResizePointer;
X Cursor MenuPointer;
X Cursor QuestionPointer;
X Cursor TargetPointer;
X Cursor PanPointer;
X Bool FocusFollowsMouse;
X Bool ReparentFlag;
X char *DefaultWinName;
X int SaveWorkspaceTimeout;
X int FlashTime;
X Bool FShowMenuButtons; /* XXX */
X Bool FShowPinnedMenuButtons; /* XXX */
X IconPreference IconPlacement;
X Bool FSnapToGrid;
X Bool FocusLenience;
X Bool DragWindow;
X Bool AutoRaise;
X int AutoRaiseDelay;
X Bool PopupJumpCursor;
X Bool ColorLocked;
X Bool PPositionCompat;
X Bool RefreshRecursively;
X BeepStatus Beep;
X int EdgeThreshold;
X int DragRightDistance;
X int MoveThreshold;
X int ClickMoveThreshold;
X int DoubleClickTime;
X int RubberBandThickness;
X KeySpec FrontKey;
X KeySpec HelpKey;
X KeySpec OpenKey;
X KeySpec ConfirmKey;
X KeySpec CancelKey;
X KeySpec ColorLockKey;
X KeySpec ColorUnlockKey;
X List *Minimals;
X int MouseChordTimeout;
X Bool SingleScreen;
X Bool AutoReReadMenuFile;
X Bool KeepTransientsAbove;
X Bool TransientsSaveUnder;
X Bool TransientsTitled;
X Bool SelectWindows;
X Bool ShowMoveGeometry;
X Bool ShowResizeGeometry;
X Bool InvertFocusHighlighting;
X Bool RunSlaveProcess;
X Bool SelectToggleStacking;
X int FlashCount;
X char *DefaultIconImage;
X char *DefaultIconMask;
X Bool ServerGrabs;
X int IconFlashCount;
X Bool SelectDisplaysMenu;
X int SelectionFuzz;
X Bool AutoInputFocus;
X Bool AutoColorFocus;
X Bool ColorTracksInputFocus;
X int IconFlashOnTime;
X int IconFlashOffTime;
X MouselessMode Mouseless;
X Bool RaiseOnActivate;
X Bool RestackWhenWithdraw;
X#ifdef OW_I18N_L3
X OLLC LC;
X#endif /* OW_I18N_L3 */
X/* Following are three entries are strictly for debugging purposes and
X * are not mentioned in the usage message or doc.
X * Orphaned events are events that are associated with a window or frame
X * has no entry in the frame hash table, or events that are not handled by the
X * various event handlers.
X * 'PrintAll' is useful for when verification of an events existance is needed.
X */
X Bool PrintOrphans;
X Bool PrintAll;
X Bool Synchronize;
X/*
X * Following are entries for the Virtual Desktop.
X */
X char *VirtualDesktop;
X int VDMScale;
X Bool AllowMoveIntoDesktop;
X Bool ArrowInRoot;
X char *VirtualGeometry;
X char *VirtualFontName;
X char *VirtualBackgroundMap;
X char *VirtualBackgroundColor;
X char *VirtualPixmapColor;
X char *VirtualIconGeometry;
X char *VirtualForegroundColor;
X char *VirtualFontColor;
X Bool VirtualIconic;
X List *StickyList;
X Bool UseRelativePosition;
X Bool GrabVirtualKeys;
X VirtualGridType VirtualGrid;
X char *VirtualGridColor;
X Bool VirtualRaiseOnMove;
X Bool VirtualRaiseVDM;
X/*
X * Following are entries added with olvwm but which aren't strictly
X * dependent on the virtual nature of olvwm
X */
X Bool AutoShowRootMenu;
X int AutoRootMenuX;
X int AutoRootMenuY;
X char *InputFocusColor;
X Bool FullSizeZoomX;
X List *NoDecors;
X char *ResizePosition;
X ImageType UseImageMenu;
X Bool VirtualMoveGroups;
X} GlobalResourceVariables;
X
Xextern GlobalResourceVariables GRV;
END_OF_FILE
if test 4138 -ne `wc -c <'globals.h'`; then
echo shar: \"'globals.h'\" unpacked with wrong size!
fi
# end of 'globals.h'
fi
if test -f 'i18n.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'i18n.c'\"
else
echo shar: Extracting \"'i18n.c'\" \(3905 characters\)
sed "s/^X//" >'i18n.c' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ifdef OW_I18N
X
Xstatic char sccsid[] ="@(#) i18n.c 1.3 91/09/14 SMI";
X
X#include "i18n.h"
X#include "mem.h"
X
X#include <stdio.h>
X#include <X11/Xlib.h>
X#include <X11/Xlibos.h>
X#include <X11/Xatom.h>
X
X/*
X * When converting the wide char to CTEXT, we need to estimate the
X * space, but there are no right way to do this without actually
X * converting. "wslen(wchar) * sizeof(wchar_t)" will give us the how
X * many bytes consume by the characters, but this does not include the
X * any control sequences. I decided use fudge bytes for this control
X * sequnces for now. This is absolutely bad idea to having a this
X * value, but otherwise we need to convert it twice. One control
X * sequnce require the 3 bytes, so, following allow to switch the code
X * set 6 times.
X */
X#define WCSTOCTS_FUDGE_BYTES (3 * 6)
X
Xwchar_t *
Xmbstowcsdup(mbs)
Xregister char *mbs;
X{
X register int n;
X register wchar_t *wcs;
X
X if (mbs == NULL)
X return NULL;
X
X n = strlen(mbs) + 1;
X wcs = (wchar_t *) MemAlloc(n * sizeof(wchar_t));
X mbstowcs(wcs, mbs, n);
X#if DEBUG > 4
Xfprintf(stderr, "mbstowcsdup: mbs [%s] -> wcs [%ws]\n", mbs, wcs);
X#endif
X
X return wcs;
X}
X
X
Xwchar_t *
Xctstowcsdup(cts)
Xregister char *cts;
X{
X register int n;
X register wchar_t *wcs;
X
X if (cts == NULL)
X return NULL;
X
X n = strlen(cts) + 1;
X wcs = (wchar_t *) MemAlloc(n * sizeof(wchar_t));
X ctstowcs(wcs, cts, n);
X
X#ifdef DEBUG > 4
Xfprintf(stderr, "ctstowcsdup: cts [%d:", n);
Xascii_dump(cts);
Xfprintf(stderr, "] -> wcs [%d:%ws]\n",
X (n * sizeof(wchar_t)), wcs);
X#endif
X
X return wcs;
X}
X
X
Xchar *
Xctstombsdup(cts)
Xregister char *cts;
X{
X register int n;
X register wchar_t *wcs;
X register char *mbs;
X
X wcs = ctstowcsdup(cts);
X if (wcs == NULL)
X return NULL;
X
X n = wslen(wcs) * sizeof(wchar_t) + 1;
X mbs = (char *) MemAlloc(n);
X wcstombs(mbs, wcs, n);
X
X MemFree (wcs);
X return mbs;
X}
X
X
Xchar *
Xwcstoctsdup(wcs)
Xregister wchar_t *wcs;
X{
X register int n;
X register char *cts;
X
X if (wcs == NULL)
X return NULL;
X
X n = wslen(wcs) * sizeof(wchar_t) + WCSTOCTS_FUDGE_BYTES + 1;
X cts = (char *) MemAlloc(n);
X /*
X * FIX_ME: We should check the result from wcstotcs, and if
X * cts does not have a enough space, we should re-allocate the
X * space and try again.
X */
X wcstocts(cts, wcs, n);
X
X#ifdef DEBUG > 4
Xfprintf(stderr, "wcstoctsdup: wcs [%d:%ws] -> cts [%d:",
X wslen(wcs), wcs, n+1);
Xascii_dump(cts);
Xfprintf(stderr, "]\n");
X#endif
X
X return cts;
X}
X
XXwcFetchName(dpy, w, name)
XDisplay *dpy;
XWindow w;
Xwchar_t **name;
X{
X return XwcGetTextWindowProperty(XA_WM_NAME, dpy, w, name);
X}
X
X
XXwcGetIconName(dpy, w, name)
XDisplay *dpy;
XWindow w;
Xwchar_t **name;
X{
X return XwcGetTextWindowProperty(XA_WM_ICON_NAME, dpy, w, name);
X}
X
X
XXwcGetTextWindowProperty(props, dpy, w, name)
XAtom props;
XDisplay *dpy;
XWindow w;
Xwchar_t **name;
X{
X register int len;
X int ret;
X Atom actual_type;
X int actual_format;
X unsigned long nitems;
X unsigned long leftover;
X unsigned char *data = NULL;
X extern Atom AtomCompoundText;
X
X ret = 0;
X if (XGetWindowProperty(dpy, w, props, 0L, (long)BUFSIZ, False,
X AnyPropertyType, &actual_type, &actual_format,
X &nitems, &leftover, &data) != Success)
X {
X *name = NULL;
X }
X else if ((actual_type == XA_STRING) && (actual_format == 8))
X {
X *name = mbstowcsdup((char *)data);
X ret = 1;
X }
X else if ((actual_type == AtomCompoundText) && (actual_format == 8))
X {
X *name = ctstowcsdup((char *)data);
X ret = 1;
X }
X else
X *name = NULL;
X
X if (data)
X Xfree((char *)data);
X return ret;
X}
X
X
X#ifdef DEBUG > 4
Xascii_dump(s)
Xregister unsigned char *s;
X{
X while (*s)
X {
X if (*s < ' ')
X fprintf(stderr, "^%c", *s + '@');
X else if (*s > 0x80)
X fprintf(stderr, "(%2x)", *s);
X else
X fputc(*s, stderr);
X s++;
X }
X}
X#endif DEBUG
X
X#endif OW_I18N
END_OF_FILE
if test 3905 -ne `wc -c <'i18n.c'`; then
echo shar: \"'i18n.c'\" unpacked with wrong size!
fi
# end of 'i18n.c'
fi
if test -f 'iconimage.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'iconimage.h'\"
else
echo shar: Extracting \"'iconimage.h'\" \(2726 characters\)
sed "s/^X//" >'iconimage.h' <<'END_OF_FILE'
X/*
X * (c) Copyright 1991 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)iconimage.h 26.9 91/09/14 SMI"
X
X#define iconimage_width 64
X#define iconimage_height 48
Xstatic unsigned char iconimage_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x48, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe4,
X 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x09, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0xb9, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x5c,
X 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xae, 0x4e, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x20, 0x17, 0x9d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xab,
X 0x3a, 0x01, 0x00, 0x00, 0x00, 0x00, 0x08, 0x45, 0x94, 0x03, 0x00, 0x00,
X 0x00, 0x00, 0x64, 0xaa, 0xca, 0x04, 0x00, 0x00, 0x00, 0x00, 0xf2, 0x14,
X 0xe5, 0x09, 0x00, 0x00, 0x00, 0x00, 0xb9, 0xa9, 0xb2, 0x13, 0x00, 0x00,
X 0x00, 0x80, 0x5c, 0x53, 0x59, 0x27, 0x00, 0x00, 0x00, 0x40, 0xae, 0xa6,
X 0xac, 0x4e, 0x00, 0x00, 0x00, 0x20, 0x17, 0x4d, 0x56, 0x9d, 0x00, 0x00,
X 0x00, 0x90, 0xab, 0x1a, 0xab, 0x3a, 0x01, 0x00, 0x00, 0xc8, 0x45, 0x94,
X 0x55, 0x75, 0x06, 0x00, 0x00, 0x98, 0xaa, 0xca, 0xaa, 0x2a, 0x09, 0x00,
X 0x00, 0x30, 0x15, 0xe5, 0x54, 0x95, 0x18, 0x00, 0x00, 0x60, 0xaa, 0xb2,
X 0xa9, 0x4a, 0x0c, 0x00, 0x00, 0xc0, 0x54, 0x59, 0x53, 0x25, 0x06, 0x00,
X 0x00, 0x80, 0xa9, 0xac, 0xa6, 0x12, 0x03, 0x00, 0x00, 0x00, 0x53, 0x56,
X 0x4d, 0x89, 0x01, 0x00, 0x00, 0x00, 0x26, 0xab, 0x9a, 0xc4, 0x00, 0x00,
X 0x00, 0x00, 0x8c, 0x55, 0x35, 0x62, 0x00, 0x00, 0x00, 0x00, 0xd8, 0xaa,
X 0x2a, 0x31, 0x00, 0x00, 0x00, 0x00, 0x70, 0x55, 0x95, 0x18, 0x00, 0x00,
X 0x00, 0x00, 0x60, 0xaa, 0x4a, 0x0c, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x54,
X 0x25, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0xa9, 0x12, 0x03, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x53, 0x89, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6,
X 0xc4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x62, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x18, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb0,
X 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x40, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
X 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 2726 -ne `wc -c <'iconimage.h'`; then
echo shar: \"'iconimage.h'\" unpacked with wrong size!
fi
# end of 'iconimage.h'
fi
if test -f 'iconmask.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'iconmask.h'\"
else
echo shar: Extracting \"'iconmask.h'\" \(2721 characters\)
sed "s/^X//" >'iconmask.h' <<'END_OF_FILE'
X/*
X * (c) Copyright 1991 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)iconmask.h 1.4 91/09/14 SMI"
X
X#define iconmask_width 64
X#define iconmask_height 48
Xstatic unsigned char iconmask_bits[] = {
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
X 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff,
X 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x7f, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff,
X 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00,
X 0x00, 0x00, 0xfc, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff,
X 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00,
X 0x00, 0x80, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
X 0xff, 0x7f, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xf8, 0xff, 0xff,
X 0xff, 0xff, 0x07, 0x00, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00,
X 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xe0, 0xff, 0xff,
X 0xff, 0xff, 0x0f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00,
X 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xff, 0xff,
X 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0x00, 0x00,
X 0x00, 0x00, 0xfc, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff,
X 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x1f, 0x00, 0x00,
X 0x00, 0x00, 0xe0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
X 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
X 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x7f, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
X 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0xc0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
X 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
X 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
END_OF_FILE
if test 2721 -ne `wc -c <'iconmask.h'`; then
echo shar: \"'iconmask.h'\" unpacked with wrong size!
fi
# end of 'iconmask.h'
fi
if test -f 'mem.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'mem.c'\"
else
echo shar: Extracting \"'mem.c'\" \(3454 characters\)
sed "s/^X//" >'mem.c' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)mem.c 26.9 91/09/14 SMI"
X
X/*
X * Safe memory allocation/free routines - front-ends the C library functions
X *
X */
X
X#include <malloc.h>
X#include <memory.h>
X#include <stdio.h>
X#include <sys/types.h>
X
X#include "i18n.h"
X
X#ifdef MEMDEBUG
X#include "st.h"
X
X#define MemAlloc d_MemAlloc
X#define MemFree d_MemFree
X#define MemRealloc d_MemRealloc
X#define MemCalloc d_MemCalloc
X
Xint MemAcct;
Xint AcctTag;
X
Xstatic st_table *memHashTable;
X
Xtypedef struct {
X unsigned int s;
X int a;
X int l;
X char *f;
X char *k;
X} Mem;
X
Xstatic int
XmemCompare(g1, g2)
X char *g1, *g2;
X{
X return (g1 - g2);
X}
X
X
Xstatic int
XmemHash(g1, modulus)
X int g1;
X int modulus;
X{
X return g1 % modulus;
X}
X
Xstatic void
XinsertAcctInfo(p, s, f, l, k)
X void *p;
X unsigned int s;
X char *f;
X int l;
X char *k;
X{
X if (MemAcct) {
X Mem *m;
X MemAcct = 0; /*prevent nasty recursion*/
X
X if (memHashTable == NULL)
X memHashTable = st_init_table(memCompare, memHash);
X
X m = (Mem *) malloc(sizeof(Mem));
X m->s = s;
X m->f = f;
X m->l = l;
X m->a = AcctTag;
X m->k = k;
X st_insert(memHashTable, p, m);
X
X MemAcct = 1;
X }
X}
X
X
Xstatic enum st_retval
Xdodump(key, rec)
X void *key;
X Mem *rec;
X{
X char extra[255];
X
X if (rec->k == NULL)
X strcpy(extra, "\n");
X else {
X if (strcmp(rec->k, "(string)") == 0)
X sprintf(extra, ":\"%s\"\n", key);
X else
X sprintf(extra, ":%s\n", rec->k);
X }
X
X fprintf(stderr, "extant: %d) 0x%.8x, (f:%s, l:%d) (%d bytes)%s",
X rec->a, key, rec->f, rec->l, rec->s, extra);
X return ST_DELETE;
X}
X
Xvoid
XDumpExtant()
X{
X if (memHashTable)
X st_foreach(memHashTable, dodump, NULL);
X else
X fprintf(stderr, "no accounting info availiable!\n");
X}
X
X#endif
X
Xvoid *
XMemAlloc(sz
X#ifdef MEMDEBUG
X , f, l, k
X#endif
X)
X unsigned int sz;
X#ifdef MEMDEBUG
X char *f;
X int l;
X char *k;
X#endif
X{
X void *p;
X
X if ((p = malloc(sz)) == NULL)
X ErrorGeneral(gettext("Memory allocation failure."));
X
X memset((char *) p, 0, (int) sz);
X
X#ifdef MEMDEBUG
X insertAcctInfo(p, sz, f, l, k);
X#endif
X
X return p;
X}
X
Xvoid *
XMemCalloc(num, sz
X#ifdef MEMDEBUG
X , f, l
X#endif
X)
X unsigned int num;
X unsigned int sz;
X#ifdef MEMDEBUG
X char *f;
X int l;
X#endif
X{
X void *p;
X
X if ((p = calloc(num, sz)) == NULL)
X ErrorGeneral(gettext("Memory array allocation failure."));
X
X memset((char *) p, 0, (int) sz * (int) num);
X
X#ifdef MEMDEBUG
X insertAcctInfo(p, sz * num, f, l, NULL);
X#endif
X
X return p;
X}
X
Xvoid *
XMemRealloc(p, sz)
X void *p;
X unsigned int sz;
X{
X void *t;
X
X if ((t = realloc(p, sz)) == NULL)
X ErrorGeneral(gettext("Memory array allocation failure."));
X
X#ifdef MEMDEBUG
X if (MemAcct && memHashTable) {
X Mem *oldM;
X MemAcct = 0;
X (void) st_delete(memHashTable, &p, (char *) &oldM);
X oldM->s = sz;
X st_insert(memHashTable, t, oldM);
X MemAcct = 1;
X }
X#endif
X
X return t;
X}
X
X
Xvoid
XMemFree(p)
X void *p;
X{
X if (p != NULL) {
X#ifdef MEMDEBUG
X if (MemAcct && memHashTable) {
X Mem *oldM;
X MemAcct = 0;
X (void) st_delete(memHashTable, &p, (char *) &oldM);
X free(oldM);
X MemAcct = 1;
X }
X#endif
X free(p);
X }
X}
END_OF_FILE
if test 3454 -ne `wc -c <'mem.c'`; then
echo shar: \"'mem.c'\" unpacked with wrong size!
fi
# end of 'mem.c'
fi
if test -f 'olgx_impl.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'olgx_impl.h'\"
else
echo shar: Extracting \"'olgx_impl.h'\" \(2771 characters\)
sed "s/^X//" >'olgx_impl.h' <<'END_OF_FILE'
X#ident "@(#)olgx_impl.h 1.14 91/04/09 SMI"
X
X/*
X * Copyright 1990 Sun Microsystems
X */
X
X/*
X * OPEN LOOK object drawing package
X */
X
X#ifndef OL_PRIVATE_DEFINED
X#define OL_PRIVATE_DEFINED
X
X#ifdef OW_I18N
X/*
X * I18N_Portability: May need to change the following #include to
X * pickup the wchar_t and X11R5(-ish) Xlib functions definitions.
X */
X#include <widec.h>
X#include <mltext/XFontSet.h>
X#endif
X#include <olgx/olgx.h>
X
X#define STRING_SIZE 128 /* max size of a glyph font string */
X
X#define VARHEIGHT_BUTTON_CORNER_DIMEN 7
X
X
X#define False 0
X#define True 1
X
X
X/*
X * OPEN LOOK constant definitions
X */
X
X
X/*
X * Macro definitions
X */
X#define VARIABLE_LENGTH_MACRO(start_pos, offset) \
X for (i = 0; i < num_add; i++) { \
X string[start_pos+i] = offset + add_ins[i]; \
X }
X
Xtypedef struct _per_disp_res_rec {
X Display * dpy;
X int screen;
X GC_rec * gc_list_ptr;
X Pixmap busy_stipple;
X Pixmap grey_stipple;
X struct _per_disp_res_rec * next;
X} per_disp_res_rec, *per_disp_res_ptr;
X
X/*
X * Definitions used by the color calculation code
X */
X#define XRGB 0xffff
X#define MAXRGB 0xff
X#define MAXH 360
X#define MAXSV 1000
X
X#define VMUL 12 /* brighten by 20% (12 = 1.2*10) */
X#define SDIV 2 /* unsaturate by 50% (divide by 2) */
X#define VMIN 400 /* minimum highlight brightness of 40% */
X
Xtypedef struct {
X int r,
X g,
X b;
X} RGB;
X
Xtypedef struct {
X int h,
X s,
X v;
X} HSV;
X
X/*
X * Private function declarations
X */
X
Xint calc_add_ins();
Xchar * olgx_malloc();
Xvoid olgx_update_horizontal_slider();
Xvoid olgx_update_vertical_slider();
Xvoid olgx_update_vertical_gauge();
Xvoid olgx_update_horiz_gauge();
Xvoid olgx_free();
Xvoid olgx_destroy_gcrec();
Xvoid olgx_total_gcs();
Xvoid olgx_initialise_gcrec();
Xvoid olgx_draw_elevator();
Xvoid olgx_error();
Xvoid olgx_draw_pixmap_label();
Xvoid olgx_draw_varheight_button();
XPixmap olgx_get_busy_stipple();
XPixmap olgx_get_grey_stipple();
Xint gc_matches();
Xint olgx_cmp_fonts();
XGC_rec * olgx_get_gcrec();
XGC_rec * olgx_gcrec_available();
XGC_rec * olgx_set_color_smart();
XGraphics_info * olgx_create_ginfo();
Xper_disp_res_ptr olgx_get_perdisplay_list();
X
X/* ol_color.c */
Xvoid hsv_to_rgb();
Xvoid rgb_to_hsv();
Xvoid rgb_to_xcolor();
Xvoid hsv_to_xcolor();
Xvoid xcolor_to_hsv();
Xvoid olgx_hsv_to_3D();
X
X#endif !OL_PRIVATE_DEFINED
X
X
X
X
X
END_OF_FILE
if test 2771 -ne `wc -c <'olgx_impl.h'`; then
echo shar: \"'olgx_impl.h'\" unpacked with wrong size!
fi
# end of 'olgx_impl.h'
fi
if test -f 'properties.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'properties.h'\"
else
echo shar: Extracting \"'properties.h'\" \(1900 characters\)
sed "s/^X//" >'properties.h' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)properties.h 26.5 91/09/14 SMI"
X
X#ifndef _OLWM_PROPERTIES_H
X#define _OLWM_PROPERTIES_H
X
X/*
X * Open Look Window Attribute structure
X */
Xtypedef struct {
X unsigned long flags;
X Atom win_type;
X Atom menu_type;
X unsigned long pin_initial_state;
X unsigned long cancel;
X} OLWinAttr;
X#define OLWINATTRLENGTH (sizeof(OLWinAttr)/sizeof(unsigned long))
X
X/*
X * Values for flags in OLWinAttr
X */
X#define WA_WINTYPE (1<<0)
X#define WA_MENUTYPE (1<<1)
X#define WA_PINSTATE (1<<2)
X#define WA_CANCEL (1<<3)
X
X/*
X * Values for flags of available top-level window-management properties
X */
X#define WMClassAvail (1<<0)
X#define WMNameAvail (1<<1)
X#define WMIconNameAvail (1<<2)
X#define WMNormalHintsAvail (1<<3)
X#define WMHintsAvail (1<<4)
X#define WMTransientForAvail (1<<5)
X#define WMProtocolsAvail (1<<6)
X#define WMColormapWindowsAvail (1<<7)
X#define WMStateAvail (1<<8)
X#define OLWinAttrAvail (1<<9)
X#define OLDecorAddAvail (1<<10)
X#define OLDecorDelAvail (1<<11)
X#define OLWindowStateAvail (1<<12)
X#define OLLeftFooterAvail (1<<13)
X#define OLRightFooterAvail (1<<14)
X
X#define ENTIRE_CONTENTS (10000000L)
X
Xextern void *GetWindowProperty();
X
Xextern int PropListAvailable();
Xextern void PropSetAvailable();
Xextern void PropClearAvailable();
X
Xextern Bool PropGetWMName();
Xextern Bool PropGetWMIconName();
Xextern Bool PropGetWMClass();
Xextern Bool PropGetWMNormalHints();
Xextern Bool PropGetWMHints();
Xextern Bool PropGetWMProtocols();
Xextern Bool PropGetWMTransientFor();
Xextern Bool PropGetWMState();
Xextern void PropSetWMState();
Xextern Bool PropGetOLWindowState();
Xextern Bool PropGetOLWinAttr();
Xextern Bool PropGetOLDecorAdd();
Xextern Bool PropGetOLDecorDel();
X
X
X#endif /* _OLWM_PROPERTIES_H */
END_OF_FILE
if test 1900 -ne `wc -c <'properties.h'`; then
echo shar: \"'properties.h'\" unpacked with wrong size!
fi
# end of 'properties.h'
fi
if test -f 'screen.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'screen.h'\"
else
echo shar: Extracting \"'screen.h'\" \(4189 characters\)
sed "s/^X//" >'screen.h' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)screen.h 1.1 olvwm version 1/3/92"
X
X/*
X * Based on
X#ident "@(#)screen.h 26.17 91/09/14 SMI"
X *
X */
X
X#ifndef _OLWM_SCREEN_H
X#define _OLWM_SCREEN_H
X
X#include <olgx/olgx.h>
X
X/*
X * Index's into GC array of ScreenInfo struct
X */
Xtypedef enum { ROOT_GC,
X FOREGROUND_GC,
X BORDER_GC,
X WINDOW_GC,
X WORKSPACE_GC,
X BUSY_GC,
X ICON_NORMAL_GC,
X ICON_MASK_GC,
X ICON_BORDER_GC,
X INPUTFOCUS_GC,
X VDM_GC,
X VDM_INPUT_GC,
X NUM_GCS
X} ScreenGCIndex;
X
X/*
X * Index's into Graphics_info array of ScreenInfo struct
X */
Xtypedef enum { NORMAL_GINFO,
X BUTTON_GINFO,
X TEXT_GINFO,
X REVPIN_GINFO,
X INPUTFOCUS_GINFO,
X NUM_GINFOS
X} ScreenGinfoIndex;
X
X/*
X * Index's into Pixmap array of ScreenInfo struct
X */
Xtypedef enum {
X BUSY_STIPPLE,
X ICON_BITMAP,
X ICON_MASK,
X PROTO_DRAWABLE,
X GRAY50_BITMAP,
X NUM_PIXMAPS
X} ScreenPixmapIndex;
X
X/*
X * ColorMapFocus - client/window which has colormap focus
X */
Xtypedef struct _colormapfocus {
X struct _client *client;
X struct _wingeneric *window;
X Bool locked;
X} ColorMapFocus;
X
X/*
X * BackgroundType - type of workspace background
X */
Xtypedef enum { BG_None, BG_Color, BG_Pixmap } BackgroundType;
X
X/*
X * ColorInfo - window/workspace/etc colors
X */
Xtypedef struct _colorinfo {
X unsigned long flags;
X Bool reverseVideo;
X unsigned long black, white;
X unsigned long fgColor, bgColor;
X unsigned long bg0Color,bg1Color,bg2Color,bg3Color;
X unsigned long borderColor;
X BackgroundType workspaceType;
X unsigned long workspaceColor;
X unsigned long workspaceRootPixel;
X unsigned long virtualFgColor, virtualBgColor;
X unsigned long virtualGridColor, virtualFontColor;
X unsigned long virtualPixmapColor;
X unsigned long virtualInputColor;
X unsigned long inputBg0Color,inputBg1Color,
X inputBg2Color,inputBg3Color;
X unsigned long vIconColor;
X} ColorInfo;
X
X#define CIWorkspaceColorAlloced (1L<<0)
X#define CIWindowColorAlloced (1L<<1)
X#define CIForegroundColorAlloced (1L<<2)
X#define CIBackgroundColorAlloced (1L<<3)
X#define CIBorderColorAlloced (1L<<4)
X#define CIVirtualForegroundColorAlloced (1L<<5)
X#define CIVirtualBackgroundColorAlloced (1L<<6)
X#define CIVirtualFontColorAlloced (1L<<7)
X#define CIVirtualGridColorAlloced (1L<<8)
X#define CIInputFocusColorAlloced (1L<<9)
X#define CIVirtualPixmapColorAlloced (1L<<10)
X
X/*
X * ScreenInfo - Per screen info
X */
Xtypedef struct _screeninfo {
X int screen;
X Window rootid;
X struct _winroot *rootwin;
X int depth;
X Visual *visual;
X Colormap colormap;
X Bool iscolor;
X Bool use3D;
X ColorInfo colorInfo;
X GC gc[NUM_GCS];
X Graphics_info *gi[NUM_GINFOS];
X Pixmap pixmap[NUM_PIXMAPS];
X struct _menuCache *menuCache;
X ColorMapFocus cmapfocus;
X int framepos;
X struct _iconGrid *iconGrid;
X char **environment;
X int instanceQ; /* quark for this screen's
X instance name */
X int dfltIconWidth, dfltIconHeight;
X struct _virtualdesktop *vdm;
X struct _menu *menuTable[NUM_MENUS];
X struct {
X struct _button **frameFullButtons;
X struct _button **frameDismissButtons;
X struct _button **frameLimitedButtons;
X } menuButtons;
X} ScreenInfo;
X
X/*
X * Global functions from screen.c
X */
Xextern void InitScreens(/* Display *dpy */);
Xextern void DestroyScreens(/* Display *dpy */);
Xextern ScreenInfo *GetFirstScrInfo();
Xextern ScreenInfo *GetScrInfoOfScreen(/* int screen */);
Xextern ScreenInfo *GetScrInfoOfRoot(/* Window root */);
Xextern void SetWorkspaceColor(/* Display *dpy */);
Xextern void SetWindowColor(/* Display *dpy */);
Xextern void SetForegroundColor(/* Display *dpy */);
Xextern void SetBackgroundColor(/* Display *dpy */);
Xextern void SetBorderColor(/* Display *dpy */);
Xextern void SetTitleFont(/* Display *dpy */);
Xextern void SetTextFont(/* Display *dpy */);
Xextern void SetButtonFont(/* Display *dpy */);
Xextern void SetIconFont(/* Display *dpy */);
Xextern void SetGlyphFont(/* Display *dpy */);
Xextern void SetIconLocation(/*Display *dpy */);
Xextern void UpdateScreenResources();
X
X#endif /* _OLWM_SCREEN_H */
END_OF_FILE
if test 4189 -ne `wc -c <'screen.h'`; then
echo shar: \"'screen.h'\" unpacked with wrong size!
fi
# end of 'screen.h'
fi
if test -f 'slave.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'slave.c'\"
else
echo shar: Extracting \"'slave.c'\" \(3354 characters\)
sed "s/^X//" >'slave.c' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X/* ----------------------------------------------------------------------
X * slave.c
X * ---------------------------------------------------------------------*/
X
X#ident "@(#)slave.c 26.8 91/09/14 SMI"
X
X#include <sys/types.h>
X#include <sys/time.h>
X#include <sys/resource.h>
X#include <X11/Xlib.h>
X#include <signal.h>
X#include <stdio.h>
X#include "cmdstream.h"
X
X/* ----------------------------------------------------------------------
X * Local Data
X * ---------------------------------------------------------------------*/
Xtypedef struct {
X char *program;
X pid_t pid;
X} SlaveInfo;
X
Xstatic SlaveInfo slaveInfo = {
X "olwmslave", 0
X};
X
X/* ----------------------------------------------------------------------
X * Local Forward Declarations
X * ---------------------------------------------------------------------*/
Xvoid SlaveFailure();
X
X/* ----------------------------------------------------------------------
X * SlaveStart
X * ---------------------------------------------------------------------*/
Xpid_t
XSlaveStart(argv)
X char **argv;
X{
X int input[2],output[2];
X struct rlimit rlimit;
X int fd,maxfd;
X
X if (pipe(input) == -1) {
X ErrorWarning("Couldn't create input pipe for olwmslave");
X perror("pipe");
X SlaveFailure();
X return -1;
X }
X if (pipe(output) == -1) {
X ErrorWarning("Couldn't create output pipe for olwmslave");
X perror("pipe");
X SlaveFailure();
X (void)close(input[0]);
X (void)close(input[1]);
X return -1;
X }
X
X slaveInfo.pid = fork();
X
X switch (slaveInfo.pid) {
X case -1: /* error */
X (void)close(input[0]);
X (void)close(input[1]);
X (void)close(output[0]);
X (void)close(output[1]);
X SlaveFailure();
X break;
X case 0: /* Slave */
X dup2(input[0],0);
X dup2(output[1],1);
X if (getrlimit(RLIMIT_NOFILE,&rlimit) == -1)
X maxfd = 0;
X else
X maxfd = rlimit.rlim_cur;
X for (fd=3; fd<maxfd ; fd++) {
X (void)close(fd);
X }
X argv[0] = slaveInfo.program;
X if (execvp(slaveInfo.program,argv) == -1) {
X SlaveFailure();
X exit(-1);
X }
X break;
X default: /* parent */
X SetCmdStream(fdopen(output[0],"r"), /* reader */
X fdopen(input[1],"w")); /* writer */
X break;
X }
X return slaveInfo.pid;
X}
X
X/* ----------------------------------------------------------------------
X * SlaveStop - call to stop Slave process
X * ---------------------------------------------------------------------*/
Xvoid
XSlaveStop()
X{
X if (slaveInfo.pid == 0)
X return;
X if (kill(slaveInfo.pid,SIGTERM) == -1) {
X /* -- dont really want this error message
X ErrorWarning("Couldn't kill olwmslave");
X perror("kill");
X */
X }
X}
X
X/* ----------------------------------------------------------------------
X * SlaveStopped - called when Slave process has died
X * ---------------------------------------------------------------------*/
Xvoid
XSlaveStopped()
X{
X SetCmdStream((FILE *)0,(FILE *)0);
X}
X
X/* ----------------------------------------------------------------------
X * SlaveFailure - called if Slave process wont/cant start
X * ---------------------------------------------------------------------*/
Xstatic void
XSlaveFailure()
X{
X char errbuf[256];
X
X sprintf(errbuf,
X "Couldn't start %s; Help for olwm will not work.",
X slaveInfo.program);
X ErrorWarning(errbuf);
X}
END_OF_FILE
if test 3354 -ne `wc -c <'slave.c'`; then
echo shar: \"'slave.c'\" unpacked with wrong size!
fi
# end of 'slave.c'
fi
if test -f 'virtual.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'virtual.h'\"
else
echo shar: Extracting \"'virtual.h'\" \(4412 characters\)
sed "s/^X//" >'virtual.h' <<'END_OF_FILE'
X/*
X * (c) Copyright 1991 Scott Oaks
X * See LEGAL_NOTICE file for terms of the license.
X */
X
X#ident "@(#)virtual.h 1.1 olvwm version 1/3/92"
X
X#ifndef _OLWM_VIRTUAL_H
X#define _OLWM_VIRTUAL_H
X
X/*
X * The virtual desktop exists as a logical abstraction only; there is no
X * actual X window called the virtual desktop to which the frames are
X * reparented (unlike other virtual managers). Frames are still reparented
X * to the root.
X *
X * Moving the virtual desktop then means that we have to move each window;
X * windows which no longer appear on the screen have coordinates outside
X * of [(0,0);(1152,900)] (or whatever the size of your screen is). This
X * means that windows on the screen still map to (0,0);(1152,900).
X *
X * Moving each window doesn't really entail much overhead, since even if
X * we had a virtual root and shifted it, we'd still have to send synthetic
X * configure events to each window.
X *
X *
X * The Virtual Desktop is the logical abstraction and is several screens
X * large. The VDM is the X window which displays this abstraction and
X * is a small X window on the display. The VDM will have a frame and look
X * like any other base window, but it may never be unstuck.
X
X <- absoluteWidth ->
X |-----------------------------------------------------|
X ^ | |
X | | |
X a | |
X b | ->offsetX, offsetY (negative from up/left|
X s | | |
X o | ******************* |
X l | * * |
X u | * * |
X t | * * |
X e | * * |
X H | * * |
X e | ******************* |
X i | |
X g | |
X h | |
X t |-----------------------------------------------------|
X
X */
X
Xtypedef struct _virtualresources {
X char *size;
X char *geometry;
X char *iconGeometry;
X int scale;
X VirtualGridType grid;
X char *background;
X} VirtualResources;
X
Xtypedef struct _virtualdesktop {
X struct _client *client; /* Handle to client structure; this
X * leads to a recursive pointer trail */
X
X int offsetX; /* Position of the upper/left corner */
X int offsetY; /* of the current screen on the VDM
X * These will always be <= 0, since it
X * should be added to a windows coord
X * to determine where on the virtual
X * desktop the window is */
X
X int absoluteWidth; /* Width of virtual desktop in pixels */
X int absoluteHeight; /* Height of virtual desk in pixels */
X
X int columns; /* Number of logical screens across */
X int rows; /* Number of logical screens down */
X int height; /* height of the VDM in pixels */
X int width; /* width of the VDM in pixels */
X int screenWidth; /* Width of logical screen within VDM */
X int screenHeight; /* Height of logical screen within VDM*/
X int screenX; /* X position of current screen in VDM*/
X int screenY; /* Y position of current screen in VDM*/
X int max_ascent; /* max ascent of font in VDM */
X int saveX; /* for save/restore, last position */
X int saveY; /* for save/restore, last position */
X VirtualResources *resources; /* Screen-specific virtual resources */
X} VirtualDesktop;
X
X/*
X * Structure to bundle the information needed to perform a drag/move within
X * the VDM
X */
Xtypedef struct _vdmstuff {
X VirtualDesktop *vdm; /* Virtual Desktop involved in move */
X int initX, initY; /* Initial location of screenX */
X int pointerX, /* Initial press of button in move */
X pointerY;
X int numMoves; /* number of times we got a motion ev */
X GC gc; /* gc to draw with (use root gc */
X} VDMstuff;
X
X/*
X * Structure to bundle amount a view into the desktop has moved
X */
Xtypedef struct deltas {
X double delta_x, delta_y;
X};
X
X#endif /* _OLWM_VIRTUAL_H */
END_OF_FILE
if test 4412 -ne `wc -c <'virtual.h'`; then
echo shar: \"'virtual.h'\" unpacked with wrong size!
fi
# end of 'virtual.h'
fi
if test -f 'winbusy.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'winbusy.c'\"
else
echo shar: Extracting \"'winbusy.c'\" \(5649 characters\)
sed "s/^X//" >'winbusy.c' <<'END_OF_FILE'
X/*
X * (c) Copyright 1989, 1990 Sun Microsystems, Inc. Sun design patents
X * pending in the U.S. and foreign countries. See LEGAL_NOTICE
X * file for terms of the license.
X */
X
X#ident "@(#)winbusy.c 1.1 olvwm version 1/3/92"
X
X/*
X * Based on
X#ident "@(#)winbusy.c 26.8 91/09/14 SMI"
X *
X */
X
X#include <errno.h>
X#include <stdio.h>
X#include <X11/Xos.h>
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <X11/Xatom.h>
X#include <olgx/olgx.h>
X
X#include "i18n.h"
X#include "ollocale.h"
X#include "mem.h"
X#include "olwm.h"
X#include "win.h"
X#include "globals.h"
X
X/***************************************************************************
X* global data
X***************************************************************************/
X
X/***************************************************************************
X* private data
X***************************************************************************/
X
Xstatic ClassBusy classBusy;
Xstatic Bool busyDisabled = True;
X
X/***************************************************************************
X* private functions
X***************************************************************************/
X
X/*
X * DestroyBusy -- destroy the busy window resources and free any allocated
X * data.
X */
Xstatic int
XdestroyBusy(dpy, winInfo)
XDisplay *dpy;
XWinBusy *winInfo;
X{
X /* free our data and throw away window */
X XUndefineCursor(dpy, winInfo->core.self);
X WinRemoveChild(winInfo->core.parent,winInfo);
X DestroyWindow(winInfo);
X MemFree(winInfo);
X}
X
X
X/*
X * widthfuncBusy - recomputes the height of the busy window
X */
Xint
XwidthfuncBusy(win, pxcre)
XWinBusy *win;
XXConfigureRequestEvent *pxcre;
X{
X WinGenericFrame *frame = (WinGenericFrame *)win->core.parent;
X return frame->fcore.panewin->core.width;
X}
X
X/*
X * heightfuncBusy - recomputes the height of the busy window
X */
Xint
XheightfuncBusy(win, pxcre)
XWinBusy *win;
XXConfigureRequestEvent *pxcre;
X{
X WinGenericFrame *frame = (WinGenericFrame *)win->core.parent;
X return frame->fcore.panewin->core.height;
X}
X
X
X/*
X *
X * REMIND
X *
X * Busy windows are effectively "turned off" by the static Bool busyDisabled.
X * The reason for this is that having a busy window on the screen over the
X * application's window will prevent that application from receiving drag-n-
X * drop messages properly. When busyDisabled is set, the following newconfig,
X * newpos, and setconfig functions prevent the busy window from changing from
X * its initial state. The initial state is set in MakeBusy, which makes the
X * busy window very small and above the upper left corner of the frame window.
X */
X
Xstatic int
XnewConfigBusy(winInfo, pxcre)
X WinBusy *winInfo;
X XConfigureRequestEvent *pxcre;
X{
X if (busyDisabled)
X return 0;
X else
X return WinNewConfigFunc(winInfo, pxcre);
X}
X
X
Xstatic int
XnewPosBusy(winInfo, x, y)
X WinBusy *winInfo;
X int x, y;
X{
X if (busyDisabled)
X return 0;
X else
X return WinNewPosFunc(winInfo, x, y);
X}
X
X
Xstatic int
XsetConfigBusy(dpy, winInfo)
X Display *dpy;
X WinBusy *winInfo;
X{
X if (busyDisabled)
X return 0;
X else
X return WinSetConfigFunc(dpy, winInfo);
X}
X
X
X
X/***************************************************************************
X* global functions
X***************************************************************************/
X
X/*
X * MakeBusy -- create the busy window. The Busy window is exactly the
X * same size as its parent and gets all keyboard and pointer events
X * for the frame. The parent is assumed to be a frame.
X */
XWinBusy *
XMakeBusy(dpy, par)
XDisplay *dpy;
XWinGenericFrame *par;
X{
X WinBusy *w;
X Window win;
X unsigned long valuemask;
X XSetWindowAttributes attributes;
X
X /* create the associated structure */
X w = MemNew(WinBusy);
X w->core.kind = WIN_BUSY;
X w->class = &classBusy;
X WinAddChild(par,w);
X w->core.children = NULL;
X w->core.client = par->core.client;
X if (busyDisabled) {
X w->core.x = -10;
X w->core.y = -10;
X w->core.width = 1;
X w->core.height = 1;
X } else {
X w->core.x = par->fcore.panewin->core.x;
X w->core.y = par->fcore.panewin->core.y;
X w->core.width = par->fcore.panewin->core.width;
X w->core.height = par->fcore.panewin->core.height;
X }
X w->core.dirtyconfig = CWX | CWY | CWWidth | CWHeight;
X w->core.exposures = NULL;
X w->isFocus = False;
X
X /* inheirit help from the parent frame */
X w->core.helpstring = par->core.helpstring;
X
X /* create the window */
X attributes.event_mask = ButtonReleaseMask | ButtonPressMask |
X KeyPressMask;
X attributes.cursor = GRV.BusyPointer;
X valuemask = CWEventMask | CWCursor;
X win = XCreateWindow(dpy, par->core.self,
X w->core.x, w->core.y,
X w->core.width, w->core.height,
X 0,
X CopyFromParent,
X InputOnly,
X CopyFromParent,
X valuemask,
X &attributes);
X
X /* fill out remaining fields */
X w->core.self = win;
X WIInstallInfo(w);
X MapRaised(w);
X
X return w;
X}
X
Xvoid
XBusyInit(dpy)
XDisplay *dpy;
X{
X classBusy.core.kind = WIN_BUSY;
X classBusy.core.xevents[ButtonPress] = NoFocusEventBeep;
X classBusy.core.xevents[ButtonRelease] = NoFocusEventBeep;
X classBusy.core.xevents[KeyPress] = NoFocusEventBeep;
X classBusy.core.xevents[KeyRelease] = NoFocusEventBeep;
X classBusy.core.focusfunc = NULL;
X classBusy.core.drawfunc = NULL;
X classBusy.core.destroyfunc = destroyBusy;
X classBusy.core.selectfunc = NULL;
X classBusy.core.newconfigfunc = newConfigBusy;
X classBusy.core.newposfunc = newPosBusy;
X classBusy.core.setconfigfunc = setConfigBusy;
X classBusy.core.createcallback = NULL;
X classBusy.core.heightfunc = heightfuncBusy;
X classBusy.core.widthfunc = widthfuncBusy;
X}
END_OF_FILE
if test 5649 -ne `wc -c <'winbusy.c'`; then
echo shar: \"'winbusy.c'\" unpacked with wrong size!
fi
# end of 'winbusy.c'
fi
echo shar: End of archive 20 \(of 21\).
cp /dev/null ark20isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 21 archives.
rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
--
Molecular Simulations, Inc. mail: dcmartin@postgres.berkeley.edu
796 N. Pastoria Avenue uucp: uwvax!ucbvax!dcmartin
Sunnyvale, California 94086 at&t: 408/522-9236