v05i053: Xrooms -- A Rooms implementation for X, Part03/14

Kent Landfield kent at ssbell.IMD.Sterling.COM
Mon Jan 15 17:06:59 AEST 1990


Submitted-by: wsl.dec.com!mikey (Mike Yang)
Posting-number: Volume 5, Issue 53
Archive-name: xrooms/part03

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 14)."
# Contents:  ./lib/nameprof.c ./lib/names.h ./utils/storage.c
#   ./xrooms/xrActions.c ./xrooms/xrDoProto.c ./xrooms/xrGen.h
#   ./xrooms/xrNames.c ./xrooms/xrProfile.c
# Wrapped by kent at ssbell on Sun Jan 14 21:57:37 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f './lib/nameprof.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./lib/nameprof.c'\"
else
echo shar: Extracting \"'./lib/nameprof.c'\" \(5279 characters\)
sed "s/^X//" >'./lib/nameprof.c' <<'END_OF_FILE'
X
X  /*\
X   *  $Header: nameprof.c,v 5.0 90/01/10 06:53:30 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X#define DEBUG_VAR	nameprofDebug
X#include "utils.h"
X#include "strtbl.h"
X#include "list.h"
X#include "nameprof.h"
X
X/***====================================================================***/
X
X	StringToken	nprDefaultName=	NullStringToken;
X
Xstatic	ListPtr		nprFunctions=	NullList;
Xstatic	NameResolveFunc	nprResolver=	NullNameResolveFunc;	
Xstatic	ChangeNamedFunc	nprChanger=	NullChangeNamedFunc;	
X
X/***====================================================================***/
X
Xvoid
XnprSetResolver(pFunc)
XNameResolveFunc	pFunc;
X{
X    uFLAG_ENTRY1(LOW_ENTRY_BIT,"nprSetResolver(0x%x)\n",pFunc);
X    nprResolver=	pFunc;
X    uFLAG_VOIDRETURN;
X}
X
X/***====================================================================***/
X
Xvoid
XnprSetChanger(pFunc)
XChangeNamedFunc	pFunc;
X{
X    uFLAG_ENTRY1(LOW_ENTRY_BIT,"nprSetChanger(0x%x)\n",pFunc);
X    nprChanger=	pFunc;
X    uFLAG_VOIDRETURN;
X}
X
X/***====================================================================***/
X
XBoolean
XnprGetName(funcName,osPriv,ppName,ppClass)
XStringToken	  funcName;
XOpaque		  osPriv;
Xchar		**ppName;
Xchar		**ppClass;
X{
Xchar		*name=	NullString;
Xchar		*class=	NullString;
XNPStatementPtr	pStmt;
X
X    uENTRY4("profileGetName(%s,0x%x,0x%x,0x%x)\n",stText(funcName),osPriv,
X								ppName,ppClass);
X    if (ppName!=(char **)NULL)	*ppName=	(char *)NULL;
X    if (ppClass!=(char **)NULL)	*ppClass=	(char *)NULL;
X    if (funcName==NullStringToken)	funcName=	nprDefaultName;
X
X    if (funcName==NullStringToken) {
X	uRETURN(False);
X    }
X
X    pStmt=	nprLookupFunction(funcName);
X    if (pStmt!=NullNPStatement) {
X	if (npEvaluate(pStmt,&name,&class,nprResolver,nprChanger,osPriv)) {
X	    if		(ppName!=(char **)NULL)	*ppName=	name;
X	    else if 	(name!=NullString)	(void)uFree((Opaque)name);
X
X	    if		(ppClass!=(char **)NULL) *ppClass=	class;
X	    else if	(class!=NullString)	 (void)uFree((Opaque)class);
X	    uRETURN(True);
X	}
X    }
X    uRETURN(False);
X}
X
X/***====================================================================***/
X
XBoolean	
XnprAddFunction(name, pStmt, merge)
XStringToken	name;
XNPStatementPtr	pStmt;
XBoolean		merge;
X{
XNPStatementPtr	pOld;
XBoolean		found;
X
X    uENTRY3("nprAddFunction(%s,0x%x,%s)\n",stText(name),pStmt,
X							booleanText(merge));
X    if (name==NullStringToken)	name=	nprDefaultName;
X    if ((name==NullStringToken)||(pStmt==NullNPStatement)) {
X	uRETURN(False);
X    }
X    if (nprFunctions==NullList) {
X	nprFunctions= lCreate((unsigned)7,NullListSortFunc,genIntegerKeyType,
X							  genPointerDataType);
X	if (nprFunctions==NullList) {
X	    uInternalError("allocation failure in nprAddFunction\n");
X	    uRETURN(False);
X	}
X    }
X
X    found=	(lLookup(nprFunctions,(GenKey)name,(GenData *)&pOld)&&
X		 (pOld!=NullNPStatement));
X    merge=	merge&&found;
X    if (merge)	npAppendStatement(pOld,pStmt);
X    else {
X	lStore(nprFunctions,(GenKey)name,(GenData)pStmt);
X	if (found)
X	    npDestroyStatement(pOld);
X    }
X    uRETURN(True);
X}
X
X/***====================================================================***/
X
XNPStatementPtr
XnprRemoveFunction(name, destroy)
XStringToken	name;
XBoolean		destroy;
X{
XNPStatementPtr	pOld;
X
X    uENTRY2("nprRemoveFunction(%s,%s)\n",stText(name),booleanText(destroy));
X    if ((nprFunctions==NullList)||(name==NullStringToken)) {
X	uRETURN(NullNPStatement);
X    }
X    if (lLookup(nprFunctions,(GenKey)name,(GenData *)&pOld)&&
X	(pOld!=NullNPStatement)) {
X	lRemove(nprFunctions,(GenKey)name);
X	if (destroy) {
X	    npDestroyStatement(pOld);
X	    pOld=	NullNPStatement;
X	}
X    }
X    else pOld=	NullNPStatement;
X    uRETURN(pOld);
X}
X
X/***====================================================================***/
X
XNPStatementPtr
XnprLookupFunction(name)
XStringToken	name;
X{
XNPStatementPtr	pStmt;
X
X    uENTRY1("nprLookupFunction(%s)\n",stText(name));
X    if (name==NullStringToken)	name=	nprDefaultName;
X    if ((nprFunctions==NullList)||(name==NullStringToken)) {
X	uRETURN(NullNPStatement);
X    }
X    if (lLookup(nprFunctions,(GenKey)name,(GenData *)&pStmt)) {
X	uRETURN(pStmt);
X    }
X    uRETURN(NullNPStatement);
X}
END_OF_FILE
if test 5279 -ne `wc -c <'./lib/nameprof.c'`; then
    echo shar: \"'./lib/nameprof.c'\" unpacked with wrong size!
fi
# end of './lib/nameprof.c'
fi
if test -f './lib/names.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./lib/names.h'\"
else
echo shar: Extracting \"'./lib/names.h'\" \(4148 characters\)
sed "s/^X//" >'./lib/names.h' <<'END_OF_FILE'
X#ifndef NAMES_H
X#define	NAMES_H
X
X  /*\
X   *  $Header: names.h,v 5.0 90/01/10 06:53:42 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X  /*\
X
X  \*/
X
X	/*\
X	 * This package implements an interpreter for a small language
X	 * that is used in xrooms to determine a unique name for a structure
X	 * (a window in xrooms).  This language assumes that there is a list 
X	 * of named properties associated with the structure we are using,
X	 * but doesn't know anything about reading those properties directly.
X	 * Instead, it calls a PropLookup function to find the value of a 
X	 * property on a window.
X	\*/
Xtypedef	struct	_NPStateRec		*NPStatePtr;
Xtypedef	struct	_NPBoolExprRec		*NPBoolExprPtr;
Xtypedef	struct	_NPStringExprRec	*NPStringExprPtr;
Xtypedef struct	_NPCaseRec		*NPCasePtr;
Xtypedef	struct	_NPStatementRec		*NPStatementPtr;
X
X#define	NullNPState		((NPStatePtr)NULL)
X#define	NullNPBoolExpr		((NPBoolExprPtr)NULL)
X#define	NullNPStringExpr	((NPStringExprPtr)NULL)
X#define	NullNPCase		((NPCasePtr)NULL)
X#define	NullNPStatement		((NPStatementPtr)NULL)
X
X	/*\
X	 * Legal types of string expression
X	\*/
X#define	NPStringConstant	((unsigned)1)
X#define	NPPropertyName		((unsigned)2)
X#define	NPIdentifier		((unsigned)3)
X#define	NPStringConcat		((unsigned)4)
X#define	NPStringConditional	((unsigned)5)
X
X	/*\
X	 * Functions to resolve and change string values provided
X	 * by the OS layer
X	\*/
Xtypedef	Boolean	(*NameResolveFunc)(/*osPriv,what,name,pRtrn*/);
Xtypedef	Boolean	(*ChangeNamedFunc)(/*osPriv,what,name,value,append*/);
X#define	NullNameResolveFunc	((NameResolveFunc)NULL)
X#define	NullChangeNamedFunc	((ChangeNamedFunc)NULL)
X
Xextern	unsigned	 namesDebug;
Xextern	char		*npJoinText;
X
Xextern	void		 npDestroyStatement(/* pStmt */);
X
Xextern	void		 npWriteStatement(/* file, indent, pStatement*/);
X
Xextern	NPStringExprPtr	 npStringTerminal(/*type,strValue*/);
Xextern	NPStringExprPtr	 npStringConcat(/* pLeft, pRight */);
Xextern	NPStringExprPtr	 npStringConditional(/* pCond, pTrue, pFalse */);
X
Xextern	NPBoolExprPtr	 npUnaryExpr(/* invert, strExpr */);
Xextern	NPBoolExprPtr	 npEquals(/* pLeft, pRight */);
X
Xextern	NPStatementPtr	 npIfStatement(/* cond, then, else */);
Xextern	NPCasePtr	 npCase(/* pattern, statement */);
Xextern	NPStatementPtr	 npSwitchStatement(/* str, choices, dfltCase */);
Xextern	NPStatementPtr	 npUseStatement(/* name */);
Xextern	NPStatementPtr	 npClassStatement(/*  class */);
Xextern	NPStatementPtr	 npAssignStatement(/* lhsExpr, valueExpr, append */);
Xextern	NPStatementPtr	 npIgnoreStatement();
Xextern	NPStatementPtr	 npComment(/* str */);
Xextern	void		 npInsertStatement(/* after, added */);
Xextern	void		 npAppendStatement(/* onto, added */);
Xextern	void		 npAppendCase(/* onto, added */);
X
Xextern	Boolean	npEvalStringExpr(/*pExpr,ppRtrn,LookupFunc,ChangeFunc,priv*/);
Xextern	Boolean	npEvalBoolExpr(/*pStmt,ppMatch,LookupFunc,ChangeFunc,priv*/);
Xextern	Boolean	npEvaluate(/*pStmt,ppName,ppClass,LookupFunc,ChangeFunc,priv*/);
X
X#define	MAX_NAME_LEN	1024
X
X#endif /* NAMES_H */
END_OF_FILE
if test 4148 -ne `wc -c <'./lib/names.h'`; then
    echo shar: \"'./lib/names.h'\" unpacked with wrong size!
fi
# end of './lib/names.h'
fi
if test -f './utils/storage.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./utils/storage.c'\"
else
echo shar: Extracting \"'./utils/storage.c'\" \(4932 characters\)
sed "s/^X//" >'./utils/storage.c' <<'END_OF_FILE'
X
X  /*\
X   *  $Header: storage.c,v 5.0 90/01/10 06:51:14 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X#define	DEBUG_VAR	genDebug
X#include "utils.h"
X#include "storagestr.h"
X
X/***====================================================================***/
X
Xint
XgenHashString(inKey)
XGenKey	inKey;
X{
Xchar	*key= (char *)inKey;
Xint	total;
X
X    uENTRY1("genHashString(%s)\n",key);
X
X    total= *key++;
X    if (*key)	total|= ((*key++)<<16)&0x00ff0000;
X    if (*key)	total|=	((*key++)<<8)&0x0000ff00;
X    if (*key)	total|=	((*key++)<<24)&0xff000000;
X    uRETURN(total);
X}
X
XGenData
XgenReplaceFreedStringData( newDataIn, ppOldDataIn )
XGenData	 newDataIn;
XGenData	*ppOldDataIn;
X{
Xchar	 *newData=	(char *)newDataIn;
Xchar	**ppOldData=	(char **)ppOldDataIn;
X
X    uENTRY3("genReplaceStringData(%s,0x%x(%s))\n",newData,ppOldData,
X							*ppOldData); 
X    if ((ppOldData)&&(*ppOldData)) {
X	uFree((Opaque)*ppOldData);
X	*ppOldData=	NULL;
X    }
X    uRETURN((GenData)uStringDup(newData));
X}
X
XGenData
XgenReplaceFreedPointerData( newDataIn, ppOldDataIn )
XGenData	 newDataIn;
XGenData	*ppOldDataIn;
X{
Xchar	*newData=	(char *)newDataIn;
Xchar	**ppOldData=	(char **)ppOldDataIn;
X
X    uENTRY2("genReplacePointerData(%s,0x%x)\n",newData,ppOldData); 
X    if ((ppOldData)&&(*ppOldData)) {
X	uFree((Opaque)*ppOldData);
X	*ppOldData=	NULL;
X    }
X    uRETURN((GenData)newData);
X}
X
XComparison
XgenCompareStringKey( key1, key2 )
XGenKey	key1,key2;
X{
Xchar	*str1=	(char *)key1;
Xchar	*str2=	(char *)key2;
X    uENTRY2("genCompareStringKey(%s,%s)\n",uStringText(str1),uStringText(str2));
X    uRETURN(uStringCompare(str1,str2));
X}
X
XGenData
XgenDupStringData( data )
XGenData	data;
X{
Xchar	*str=	(char *)data;
X    uENTRY1("genDupStringData(%s)\n",uStringText(str));
X    str= uStringDup(str);
X    uRETURN((GenData)str);
X}
X
Xvoid
XgenFreeKey( key )
XGenKey		key;
X{
X    uENTRY1("genFreeKey(0x%x)\n",key);
X    uFree((Opaque)key);
X    uVOIDRETURN;
X}
X
Xvoid
XgenFreeData( data )
XGenData	data;
X{
X    uENTRY1("genFreeData(0x%x)\n",data);
X    uFree((Opaque)data);
X    uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xstatic	GenKeyDescRec	genFreedStringKeyTypeRec= {
X	(HashFunc)genHashString,	
X	(CompareKeyFunc)genCompareStringKey,
X	(StoreKeyFunc)genDupStringData,
X	(RemoveKeyFunc)genFreeKey,
X	(GenKey)NULL
X};
X
Xstatic	GenKeyDescRec	genStringKeyTypeRec= {
X	(HashFunc)genHashString,	
X	(CompareKeyFunc)genCompareStringKey,
X	(StoreKeyFunc)NULL,
X	(RemoveKeyFunc)NULL,
X	(GenKey)NULL
X};
X
Xstatic	GenKeyDescRec	genIntegerKeyTypeRec=	{
X	(HashFunc)NULL,	
X	(CompareKeyFunc)NULL,
X	(StoreKeyFunc)NULL,
X	(RemoveKeyFunc)NULL,
X	(GenKey)-1
X};
X
XGenKeyDescPtr	genStringKeyType=	&genStringKeyTypeRec;
XGenKeyDescPtr	genFreedStringKeyType=	&genFreedStringKeyTypeRec;
XGenKeyDescPtr	genIntegerKeyType=	&genIntegerKeyTypeRec;
XGenKeyDescPtr	genDefaultKeyType=	&genFreedStringKeyTypeRec;
X
Xstatic	GenDataDescRec genFreedStringDataTypeRec= {
X	(StoreDataFunc)genDupStringData,
X	(ReplaceDataFunc)genReplaceFreedStringData,
X	(RemoveDataFunc)genFreeData,
X	(GenData)NULL,
X};
X
Xstatic	GenDataDescRec	genPointerDataTypeRec=	{
X	(StoreDataFunc)NULL,
X	(ReplaceDataFunc)NULL,
X	(RemoveDataFunc)NULL,
X	(GenData)NULL,
X};
X
Xstatic	GenDataDescRec	genFreedPointerDataTypeRec=	{
X	(StoreDataFunc)NULL,
X	(ReplaceDataFunc)genReplaceFreedPointerData,
X	(RemoveDataFunc)genFreeData,
X	(GenData)NULL,
X};
X
X
Xstatic	GenDataDescRec	genIntegerDataTypeRec=	{
X	(StoreDataFunc)NULL,
X	(ReplaceDataFunc)NULL,
X	(RemoveDataFunc)NULL,
X	(GenData)-1,
X};
X
XGenDataDescPtr	genFreedStringDataType=	&genFreedStringDataTypeRec;
XGenDataDescPtr	genPointerDataType=	&genPointerDataTypeRec;
XGenDataDescPtr	genFreedPointerDataType=	&genFreedPointerDataTypeRec;
XGenDataDescPtr	genIntegerDataType=	&genIntegerDataTypeRec;
XGenDataDescPtr	genDefaultDataType=	&genPointerDataTypeRec;
X
END_OF_FILE
if test 4932 -ne `wc -c <'./utils/storage.c'`; then
    echo shar: \"'./utils/storage.c'\" unpacked with wrong size!
fi
# end of './utils/storage.c'
fi
if test -f './xrooms/xrActions.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./xrooms/xrActions.c'\"
else
echo shar: Extracting \"'./xrooms/xrActions.c'\" \(6229 characters\)
sed "s/^X//" >'./xrooms/xrActions.c' <<'END_OF_FILE'
X
X  /*\
X   *  $Header: xrActions.c,v 5.3 90/01/11 14:10:25 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X#include <X11/Xlib.h>
X#include <X11/cursorfont.h>
X#include <X11/Xutil.h>
X
X#define	DEBUG_VAR	xractDebug
X#include "utils.h"
X#include "hash.h"
X
X#include "appstate.h"
X#include "apps.h"
X#include "rooms.h"
X
X#include "xrDebug.h"
X#include "xrXUtils.h"
X#include "xrApp.h"
X#include "xrGen.h"
X#include "xrProtoArgs.h"
X#include "xrProtoIter.h"
X#include "xrActions.h"
X#include "xrooms.h"
X
Xextern void xruiPopDownWinMenu();
X
X/***====================================================================***/
X
Xvoid
XxractDoSetAll()
X{
XxrSetStateArgsRec	args;
X    xruiPopDownWinMenu();
X    args.doWhat=	'S'; 		/* set */
X    args.toWhat=	'P'; 		/* parts */
X    args.whichPart=	XR_QUERY_PARTS; /* let the user decide */
X    args.whichState=	XR_ALL_STATES;	/* clobber everything */
X    if (xroomsSetupMode)
X	 args.whichApp= XR_QUERY_MULT_APPS;	/* pick a bunch */
X    else args.whichApp=	XR_QUERY_APP;		/* let the user decide */
X    args.appName=	NULL;		/* no name needed */
X    args.whichRoom=	XR_CURRENT_ROOM;/* take current room */
X    args.roomName=	NULL;		/* no name needed */
X    xrdpDoSetState(&args);
X    return;
X}
X
X/***====================================================================***/
X
Xvoid
XxractDoSetLocalOnly()
X{
XAppPtr		pApp;
XAppStatePtr	pState;
XRoomPtr		pRoom;
XOpaque		ristate;
X
X    xruiPopDownWinMenu();
X    xractDoSetAll();
X    pApp= xrpaGetLastApp();
X    pRoom= GetCurrentRoom();
X    if ((pApp!=NullApp)&&(pRoom!=NullRoom)) {
X	pState= appGetDefault(pApp);
X	appSetRoomState(pApp,roomName(pRoom),pState,False);
X	asChangeSelected(pState,asWinStateValue,asIconic,0,0,(unsigned)0,
X							(unsigned)0);
X	RoomsIterator(pRoom,ristate) {
X	    roomCheckAppStates(pRoom,pApp);
X	}
X	RoomsEndIterator(ristate);
X    }
X    return;
X}
X
X/***====================================================================***/
X
Xstatic xrRememberArgsRec remArgs = {
X	True,	XR_QUERY_APP, 	0
X};
X
Xvoid
XxractDoMakePermanent()
X{
X    xruiPopDownWinMenu();
X    remArgs.remember=	True;
X    xrdpDoRemember(&remArgs);
X    return;
X}
X
X/***====================================================================***/
X
Xvoid
XxractDoMakeTransient()
X{
X    xruiPopDownWinMenu();
X    remArgs.remember=	False;
X    xrdpDoRemember(&remArgs);
X    return;
X}
X
X/***====================================================================***/
X
Xvoid
XxractDoBoltGeom()
X{
XxrSetStateArgsRec	args;
X
X    xruiPopDownWinMenu();
X    args.doWhat=	'S'; 			/* set */
X    args.toWhat=	'B'; 			/* bolts */
X    args.whichPart=	XR_QUERY_PARTS; 	/* let the user decide */
X    args.whichState=	XR_VISIBLE_STATE;	/* take visible state */
X    if (xroomsSetupMode)
X	 args.whichApp= XR_QUERY_MULT_APPS;	/* pick a bunch */
X    else args.whichApp=	XR_QUERY_APP;		/* let the user decide */
X    args.appName=	NULL;			/* no name needed */
X    args.whichRoom=	XR_CURRENT_ROOM;	/* take current room */
X    args.roomName=	NULL;			/* no name needed */
X    xrdpDoBolt(&args);
X    return;
X}
X
X/***====================================================================***/
X
Xvoid
XxractDoUnboltGeom()
X{
XxrSetStateArgsRec	args;
X    xruiPopDownWinMenu();
X    args.doWhat=	'C'; 			/* clear */
X    args.toWhat=	'B'; 			/* bolts */
X    args.whichPart=	XR_QUERY_PARTS; 	/* let the user decide */
X    args.whichState=	XR_VISIBLE_STATE;	/* visible state */
X    if (xroomsSetupMode)
X	 args.whichApp= XR_QUERY_MULT_APPS;	/* pick a bunch */
X    else args.whichApp=	XR_QUERY_APP;		/* let the user decide */
X    args.appName=	NULL;			/* no name needed */
X    args.whichRoom=	XR_CURRENT_ROOM;	/* in current room */
X    args.roomName=	NULL;			/* no name needed */
X    xrdpDoBolt(&args);
X    return;
X}
X
X/***====================================================================***/
X
Xvoid
XxractDoBoltState()
X{
XxrSetStateArgsRec	args;
X    xruiPopDownWinMenu();
X    args.doWhat=	'M'; 			/* merge */
X    args.toWhat=	'B'; 			/* bolts */
X    args.whichPart=	XR_WINSTATE_PART;	/* window state only */
X    args.whichState=	XR_VISIBLE_STATE;	/* visible state */
X    if (xroomsSetupMode)
X	 args.whichApp= XR_QUERY_MULT_APPS;	/* pick a bunch */
X    else args.whichApp=	XR_QUERY_APP;		/* let the user decide */
X    args.appName=	NULL;			/* no name needed */
X    args.whichRoom=	XR_CURRENT_ROOM;	/* in current room */
X    args.roomName=	NULL;			/* no name needed */
X    xrdpDoBolt(&args);
X    return;
X}
X
X/***====================================================================***/
X
Xvoid
XxractDoUnboltState()
X{
XxrSetStateArgsRec	args;
X    xruiPopDownWinMenu();
X    args.doWhat=	'C'; 			/* clear */
X    args.toWhat=	'B'; 			/* bolts */
X    args.whichPart=	XR_WINSTATE_PART;	/* window state only */
X    args.whichState=	XR_VISIBLE_STATE;	/* whichever state is visible */
X    if (xroomsSetupMode)
X	 args.whichApp= XR_QUERY_MULT_APPS;	/* pick a bunch */
X    else args.whichApp=	XR_QUERY_APP;		/* let the user decide */
X    args.appName=	NULL;			/* no name needed */
X    args.whichRoom=	XR_CURRENT_ROOM;	/* in this room */
X    args.roomName=	NULL;			/* no name needed */
X    xrdpDoBolt(&args);
X    return;
X}
X
END_OF_FILE
if test 6229 -ne `wc -c <'./xrooms/xrActions.c'`; then
    echo shar: \"'./xrooms/xrActions.c'\" unpacked with wrong size!
fi
# end of './xrooms/xrActions.c'
fi
if test -f './xrooms/xrDoProto.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./xrooms/xrDoProto.c'\"
else
echo shar: Extracting \"'./xrooms/xrDoProto.c'\" \(6489 characters\)
sed "s/^X//" >'./xrooms/xrDoProto.c' <<'END_OF_FILE'
X
X  /*\
X   *  $Header: xrDoProto.c,v 5.2 90/01/11 14:11:26 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X#include <X11/Xlib.h>
X#include <X11/cursorfont.h>
X#include <X11/Xutil.h>
X
X#define	DEBUG_VAR	xrdpDebug
X#include "utils.h"
X#include "hash.h"
X
X#include "appstate.h"
X#include "apps.h"
X#include "rooms.h"
X
X#include "xrDebug.h"
X#include "xrXUtils.h"
X#include "xrApp.h"
X#include "xrGen.h"
X#include "xrProtoArgs.h"
X#include "xrProtoIter.h"
X#include "xrooms.h"
X
X
X/***====================================================================***/
X
Xchar *
XxrdpDoGetAppName(which,appName)
Xunsigned	which;
Xchar		*appName;
X{
XAppPtr		pApp;
Xchar		*name;
X
X    uENTRY2("xrdpDoGetAppName(0x%x,%s)\n",which,uStringText(appName));
X    pApp=	xrpaGetApp(which,appName);
X    if (pApp!=NullApp) {
X	name=	appText(pApp);
X    }
X    else name=	NullString;
X    uRETURN(name);
X}
X
X/***====================================================================***/
X
XBoolean
XxrdpDoRemember(pArgs)
XxrRememberArgsPtr	pArgs;
X{
XAppPtr		 pApp;
XBoolean		 ok= True;
X
X    uENTRY1("xrdpDoRemember(0x%x)\n",pArgs);
X    pApp=	xrpaGetApp(pArgs->whichApp,pArgs->appName);
X    if (pApp!=NullApp)
X	 ok= SetAppPermanence(pApp,pArgs->remember);
X    else ok= False;
X
X    if (!ok) {
X	uWarning("REMEMBER request failed\n");
X    }
X    uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
XxrdpDoSetState(pArgs)
XxrSetStateArgsPtr	pArgs;
X{
XAppStatePtr	 pState,pRealState;
XAppPtr		 pApp;
XRoomPtr		 pRoom;
XOpaque		 riState,aiState,asiState;
XBoolean		 ok= True;
XBoolean		 checkAllRooms= False;
Xunsigned	 parts;
X
X    uENTRY1("xrdpDoSetState(0x%x)\n",pArgs);
X
X    if (pArgs->whichState&XR_DFLT_STATE) {
X	pArgs->whichRoom=	XR_CURRENT_ROOM;
X    }
X    if (pArgs->whichState==XR_LOCAL_STATE) {
X	pArgs->whichState|=	XR_CREATE_LOCAL_STATES;
X    }
X    if (pArgs->whichState&(XR_ALL_STATES)) {
X	checkAllRooms=	True;
X	if (pArgs->whichRoom&(XR_ALL_ROOMS|XR_VISIBLE_ROOMS)) {
X	    pArgs->whichRoom=	XR_CURRENT_ROOM;
X	}
X	pArgs->whichState|=	XR_DESTROY_LOCAL_STATES;
X    }
X
X    xrpiAppsIterator(pArgs->whichApp,pApp,pArgs->appName,aiState) {
X	pRealState=	appGetCurrent(pApp);
X	if (pArgs->whichPart&XR_QUERY_PARTS)
X	     parts= xrpaLastParts()|XR_WINSTATE_PART;
X	else parts= pArgs->whichPart;
X	xrpiRoomsIterator(pArgs->whichRoom,pRoom,pArgs->roomName,riState) {
X	    xrpiAppStatesIterator(pApp,pRoom,pArgs->whichState,pState,asiState){
X		switch (pArgs->doWhat) {
X		    case 'M':	parts|=	asFlags(pState);
X				break;
X		    case 'C':	parts=	asFlags(pState)&(~parts);
X		    default:	break;
X		}
X		asChangeProfileFlags(pRealState,pState,parts);
X	    }
X	    xrpiEndAppStatesIterator(pApp,asiState);
X	    if (!checkAllRooms)
X		roomCheckAppStates(pRoom,pApp);
X	}
X	xrpiEndRoomsIterator(riState);
X	if (checkAllRooms) {
X	    RoomsIterator(pRoom,riState) {
X		roomCheckAppStates(pRoom,pApp);
X	    }
X	    RoomsEndIterator(riState);
X	}
X    }
X    xrpiEndAppsIterator(aiState);
X    if (!ok) {
X	uWarning("SET STATE request failed\n");
X    }
X    uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
XxrdpDoBolt(pArgs)
XxrSetStateArgsPtr	pArgs;
X{
XAppStatePtr	 pState;
XAppPtr		 pApp;
XRoomPtr		 pRoom;
XOpaque		 riState,aiState,asiState;
XBoolean		 ok= True;
XBoolean		 checkRoom= False;
XBoolean		(*changeFunc)(/* pState, parts */);
Xunsigned	 parts;
X
X    uENTRY1("xrdpDoBolt(0x%x)\n",pArgs);
X
X    if (pArgs->whichState&(XR_ALL_STATES|XR_DFLT_STATE)) {
X	pArgs->whichRoom=	XR_CURRENT_ROOM;
X    }
X    if (pArgs->whichState==XR_LOCAL_STATE) {
X	checkRoom=	True;
X	pArgs->whichState|=	XR_CREATE_LOCAL_STATES;
X    }
X
X    if (pArgs->toWhat=='B') {
X	switch (pArgs->doWhat) {
X	    case 'S':	changeFunc=	asSetBolts;	break;
X	    case 'M':	changeFunc=	asBolt;		break;
X	    case 'C':	changeFunc=	asUnbolt;	break;
X	}
X    }
X    else {
X	switch (pArgs->doWhat) {
X	    case 'S':	changeFunc=	asSetLooseBolts;	break;
X	    case 'M':	changeFunc=	asLoosenBolts;		break;
X	    case 'C':	changeFunc=	asTightenBolts;		break;
X	}
X    }
X
X    xrpiAppsIterator(pArgs->whichApp,pApp,pArgs->appName,aiState) {
X	if (pArgs->whichPart&XR_QUERY_PARTS)
X	     parts= xrpaLastParts();
X	else parts= pArgs->whichPart;
X	xrpiRoomsIterator(pArgs->whichRoom,pRoom,pArgs->roomName,riState) {
X	    xrpiAppStatesIterator(pApp,pRoom,pArgs->whichState,pState,asiState){
X		if (pArgs->whichPart&XR_QUERY_PARTS)
X		    parts|=	(asBolts(pState)&asWinStateValue);
X		(*changeFunc)(pState,parts);
X	    }
X	    xrpiEndAppStatesIterator(pApp,asiState);
X	    if (checkRoom)
X		roomCheckAppStates(pRoom,pApp);
X	}
X	xrpiEndRoomsIterator(riState);
X    }
X    xrpiEndAppsIterator(aiState);
X    if (!ok) {
X	uWarning("BOLT request failed\n");
X    }
X    uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
XxrdpDoSetVisibility(pArgs)
XxrVisibilityArgsPtr	pArgs;
X{
XBoolean	ok=	True;
XRoomPtr	pRoom;
XOpaque	riState;
X
X    uENTRY1("xrdpDoSetVisibility(0x%x)\n",pArgs);
X    if (pArgs==(xrVisibilityArgsPtr)NULL) {
X	uRETURN(False);
X    }
X
X    if (pArgs->createRoom) {
X	pArgs->whichRoom|= XR_CREATE_ROOM;
X    }
X    xrpiRoomsIterator(pArgs->whichRoom,pRoom,pArgs->roomName,riState) {
X	ok= roomSetVisibility(pRoom,pArgs->visibility,pArgs->checkAuto)&&ok;
X    }
X    xrpiEndRoomsIterator(riState);
X
X    if (!ok) {
X	uWarning("VISIBILITY request failed\n");
X    }
X    uRETURN(ok);
X}
END_OF_FILE
if test 6489 -ne `wc -c <'./xrooms/xrDoProto.c'`; then
    echo shar: \"'./xrooms/xrDoProto.c'\" unpacked with wrong size!
fi
# end of './xrooms/xrDoProto.c'
fi
if test -f './xrooms/xrGen.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./xrooms/xrGen.h'\"
else
echo shar: Extracting \"'./xrooms/xrGen.h'\" \(5699 characters\)
sed "s/^X//" >'./xrooms/xrGen.h' <<'END_OF_FILE'
X#ifndef XRGEN_H
X#define	XRGEN_H 1
X
X  /*\
X   *  $Header: xrGen.h,v 5.0 90/01/10 07:00:53 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X#include <X11/Xlib.h>
X#include <X11/Xatom.h>
X
Xtypedef struct _xrRequestRec {
X	unsigned	request;
X	unsigned	size;
X	Window		win;
X} xrRequestRec,*xrRequestPtr;
X
X#define	XR_RQ_NOOP		0
X#define	XR_RQ_SET_STATE		1
X#define	XR_RQ_REMEMBER		2
X#define	XR_RQ_SET_VISIBILITY	3
X#define	XR_RQ_LOAD_PROFILE	4
X#define	XR_RQ_APP_NAME		9
X#define	XR_RQ_DEBUG		10
X
X	/*
X	 * these should correspond to values in appstate.h
X	 */
X#define	XR_X_PART		((unsigned)(1<<0))
X#define	XR_Y_PART		((unsigned)(1<<1))
X#define	XR_POSITION_PART	(XR_X_PART|XR_Y_PART)
X#define	XR_WIDTH_PART		((unsigned)(1<<2))
X#define	XR_HEIGHT_PART		((unsigned)(1<<3))
X#define	XR_SIZE_PART		(XR_WIDTH_PART|XR_HEIGHT_PART)
X#define	XR_X_NEGATIVE		((unsigned)(1<<4))
X#define	XR_Y_NEGATIVE		((unsigned)(1<<5))
X#define	XR_GEOM_PARTS		(XR_POSITION_PART|XR_SIZE_PART)
X#define	XR_WINSTATE_PART	((unsigned)(1<<8))
X#define	XR_QUERY_PARTS		((unsigned)(1<<10))
X#define	XR_ALL_PARTS		(XR_GEOM_PARTS|XR_WINSTATE_PART)
X
X#define	XR_QUERY_STATE		((unsigned)(1<<0))
X#define	XR_VISIBLE_STATE	((unsigned)(1<<1))
X#define	XR_LOCAL_STATE		((unsigned)(1<<2))
X#define	XR_DFLT_STATE		((unsigned)(1<<3))
X#define	XR_ALL_STATES		((unsigned)(1<<4))
X#define	XR_WHICH_MASK		((unsigned)0x1f)
X#define	XR_CREATE_LOCAL_STATES	((unsigned)(1<<9))
X#define	XR_DESTROY_LOCAL_STATES	((unsigned)(1<<10))
X
X#define	XR_QUERY_APP		((unsigned)(1<<0))
X#define	XR_QUERY_MULT_APPS	((unsigned)(1<<1))
X#define	XR_NAMED_APP		((unsigned)(1<<2))
X#define	XR_WINDOW_APP		((unsigned)(1<<3))
X#define	XR_LAST_APP		((unsigned)(1<<4))
X#define	XR_ALL_APPS		((unsigned)(1<<5))
X#define	XR_ACTIVE_APPS		((unsigned)(1<<6))
X#define	XR_NO_APP		((unsigned)(1<<7))
X
X	/*
X	 * these should correspond to values from room.h
X	 */
X#define	XR_ROOM_HIDDEN		((unsigned)0)
X#define	XR_ROOM_VISIBLE		((unsigned)1<<0)
X#define	XR_ROOM_WHEN_NON_EMPTY	((unsigned)1<<1)
X#define	XR_ROOM_WHEN_ACTIVE	((unsigned)1<<2)
X#define	XR_ROOM_ALWAYS		((unsigned)1<<3)
X
X#define	XR_QUERY_ROOM		((unsigned)(1<<0))
X#define	XR_QUERY_MULT_ROOMS	((unsigned)(1<<1))
X#define	XR_NAMED_ROOM		((unsigned)(1<<2))
X#define	XR_CURRENT_ROOM		((unsigned)(1<<3))
X#define	XR_LAST_ROOM		((unsigned)(1<<4))
X#define XR_ALL_ROOMS		((unsigned)(1<<5))
X#define	XR_VISIBLE_ROOMS	((unsigned)(1<<6))
X#define	XR_NO_ROOM		((unsigned)(1<<7))
X#define	XR_CREATE_ROOM		((unsigned)(1<<9))
X
Xtypedef	struct _xrSetStateArgsRec {
X	char		doWhat;
X	char		toWhat;
X	unsigned	whichPart;
X	unsigned	whichState;
X	unsigned	whichApp;
X	char		*appName;
X	unsigned	whichRoom;
X	char		*roomName;
X} xrSetStateArgsRec,*xrSetStateArgsPtr;
X
Xtypedef struct _xrRememberArgsRec {
X	Boolean		 remember;
X	unsigned	 whichApp;
X	char		*appName;
X} xrRememberArgsRec,*xrRememberArgsPtr;
X
Xtypedef struct _xrVisibilityArgsRec {
X	unsigned	 visibility;
X	unsigned	 whichRoom;
X	char		*roomName;
X	Boolean		 checkAuto;
X	Boolean		 createRoom;
X} xrVisibilityArgsRec,*xrVisibilityArgsPtr;
X
X/*	TYPE		SYNTAX						*/ /*	<StatePart>	[+!][+-!?][+-!?][+!?][+!?]			*/
X/*			 ^use State/don't use State			*/
X/*			      ^use positive X, negative X, don't	*/
X/*				use X, query whether to use X		*/
X/*				     ^use positive Y, negative Y, don't */
X/*				      use Y, query whether to use Y	*/
X/*				          ^ use Width, don't use Width, */
X/*					    query whether to use Width	*/
X/*						^ use Height, don't use */
X/*						  Height, query whether */
X/*						  to use Height		*/
X/*	<States>	[ADLV?]						*/
X/*			All|Default|Local|Visible|Query State		*/
X/*	<Apps>		[AVL(N<name>)(W<id>)?*]				*/
X/*			All|actiVe|Last used|Named|Window id|Query	*/
X/*						* = Query Multiple	*/
X/*	<Rooms>		[ALC(N<name>)V?]				*/
X/*			All|Last used|Current|Named|all Visible|Query	*/
X
X/*	REQUEST		ARGUMENTS					*/
X/*	NOOP		string (ignored)				*/
X/*	SET_STATE	[SMC][PBL]<StatePart><States><Apps><Rooms>	*/
X/*			Set|Merge|Clear Parts|Bolts|Loose bolts		*/ 
X/*	REMEMBER	[RF]<Apps>					*/
X/*			Remember|Forget 				*/
X/*	SET_VISIBILITY  [Aa][Nn][Aa][VH][+-][Cc]<Rooms>			*/
X/*			Always/not always Non-empty/not non-empty	*/
X/*			when Active/not when active Visible|Hidden	*/
X/*			+ = check automatic visibility, - = don't check */
X/*			Create/don't create room if necessary		*/
X/*	LOAD		string -- format of an xrooms profile		*/
X/*	DEBUG 		string (passed to xrDebugSettings)		*/
X
Xextern	Atom ROOMS_CURRENT, ROOMS_ALL; 
Xextern	Atom ROOMS_REQUEST, ROOMS_ARGUMENT, ROOMS_RETURN;
X
Xextern	void	xrgenInit(/* dpy */);
Xextern	void	xrgenCleanUp(/* dpy, root */);
X
X#endif /* XRGEN_H */
END_OF_FILE
if test 5699 -ne `wc -c <'./xrooms/xrGen.h'`; then
    echo shar: \"'./xrooms/xrGen.h'\" unpacked with wrong size!
fi
# end of './xrooms/xrGen.h'
fi
if test -f './xrooms/xrNames.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./xrooms/xrNames.c'\"
else
echo shar: Extracting \"'./xrooms/xrNames.c'\" \(6268 characters\)
sed "s/^X//" >'./xrooms/xrNames.c' <<'END_OF_FILE'
X
X  /*\
X   *  $Header: xrNames.c,v 5.1 90/01/11 14:12:56 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X#include <X11/Xlib.h>
X#include <X11/Xatom.h>
X
X#define	DEBUG_VAR	xrNamesDebug
X#include "utils.h"
X#include "strtbl.h"
X#include "nameprof.h"
X#include "rooms.h"
X
X#include "xrDebug.h"
X#include "xrXUtils.h"
X#include "xrNames.h"
X#include "xrooms.h"
X
X/***====================================================================***/
X
XBoolean		xrnUseAppNames;
XBoolean		xrnUseWindowNames;
XStringToken	xrnNameLookup;
XAtom		xrnAppNameAtom=	None;
X
X/***====================================================================***/
X
Xstatic	Boolean
XxrnResolveNames(clientIn,what,name,ppOutValue)
XOpaque	  clientIn;
Xchar	 *name;
Xchar	**ppOutValue;
X{
XAtom	  nameAtom;
XWindow	  client= (Window)clientIn;
XBoolean	  ok;
X
X    uENTRY4("XResolveNames(0x%x,0x%x,%s,0x%x,)\n",client,what,uStringText(name),
X								ppOutValue);
X    if (what==NPPropertyName) {
X	nameAtom=	(Atom)XInternAtom(xroomsDpy,name,True);
X	if (nameAtom==None) {
X	    ok=	False;
X	    *ppOutValue=	NullString;
X	}
X	else {
X	    ok= xruGetPropertyString(xroomsDpy,client,nameAtom,ppOutValue);
X	    uDEBUG2(WATCH_APPS,"PropFinder, ok= %s, string= %s\n",
X							booleanText(ok),
X			     uStringText((ppOutValue?*ppOutValue:NullString)));
X	}
X    }
X    else if (what==NPIdentifier) {
X	StringToken	nameToken;
X	if (stGetTokenIfExists(name,&nameToken)) {
X	    ok= nprGetName(nameToken,clientIn,ppOutValue,(char **)NULL);
X	}
X	else ok= False;
X	if (!ok) {
X	    if (uStringEqual(name,"currentroom")) {
X		RoomPtr	pRoom=	GetCurrentRoom();
X		if (pRoom!=NullRoom) {
X		    *ppOutValue=	uStringDup(roomText(pRoom));
X		    ok=	True;
X		}
X	    }
X	}
X    }
X    uRETURN(ok);
X}
X
X/***====================================================================***/
X
Xstatic	Boolean
XxrnChangeNamed(clientIn,what,name,value,append)
XOpaque		  clientIn;
Xunsigned	  what;
Xchar		 *name;
Xchar		 *value;
XBoolean		  append;
X{
XWindow		 client= (Window)clientIn;
X
X    uENTRY5("XRChangeNamed(0x%x,0x%x,%s,%s,0x%x)\n",client,what,
X					uStringText(name),uStringText(value),
X					booleanText(append));
X    if ((name==NullString)||(strlen(name)<1)) {
X	uRETURN(False);
X    }
X    if (what==NPPropertyName) {
X	Atom		 nameAtom;
X	unsigned	 mode;
X
X	if (append)	mode=	PropModeAppend;
X	else	mode=	PropModeReplace;
X
X	nameAtom=	(Atom)XInternAtom(xroomsDpy,name,False);
X	if ((nameAtom!=None)&&(value!=NullString)&&(strlen(value)>0)) {
X	    XChangeProperty(xroomsDpy,client,nameAtom,XA_STRING,8,mode,
X							value,strlen(value));
X	    XFlush(xroomsDpy);
X	    uDEBUG3(WATCH_APPS,"PropChange, setting <%s> to \"%s\" on 0x%x\n",
X				uStringText(name),uStringText(value),client);
X	}
X	else if (nameAtom!=None) {
X	    if (!append)
X		XDeleteProperty(xroomsDpy,client,nameAtom);
X	}
X	else {
X	    uWarning("Error interning atom for \"%s\"\n",uStringText(name));
X	}
X	uRETURN(True);
X    }
X    else if (what==NPIdentifier) {
X	if (uStringEqual(name,"currentroom")) {
X	    StringToken	nameToken=	stGetToken(value);
X	    RoomPtr	pRoom=		LookupRoom(nameToken);
X
X	    if (pRoom==NullRoom)	pRoom=	CreateRoom(nameToken);
X	    if (pRoom!=NullRoom) {
X		SwitchToRoom(pRoom);
X		uRETURN(True);
X	    }
X	}
X	uRETURN(False);
X    }
X    uRETURN(False);
X}
X
X
X/***====================================================================***/
X
XBoolean
XxrnGetName(win,ppName,ppClass)
XWindow	  win;
Xchar	**ppName;
Xchar	**ppClass;
X{
XBoolean	found;
X
X    uENTRY3("xrnGetName(0x%x,0x%x,0x%x)\n",win,ppName,ppClass);
X    *ppName=	NullString;
X    *ppClass=	NullString;
X    found= nprGetName(xrnNameLookup,(Opaque)win,ppName,ppClass);
X    if (!found) {
X        if (xrnUseAppNames&&(xrnAppNameAtom!=None)) {
X            if (!xruGetPropertyString(xroomsDpy,win,xrnAppNameAtom,ppName))
X                *ppName= NullString;
X        }
X        if (*ppName==NullString) {
X            if (xrnUseWindowNames) {
X                XFetchName(xroomsDpy, win, ppName);
X                if (*ppName==NullString)
X                    XGetIconName(xroomsDpy,win,ppName);
X            }
X            else {
X                XGetIconName(xroomsDpy, win, ppName);
X                if (*ppName==NullString)
X                    XFetchName(xroomsDpy, win, ppName);
X            }
X        }
X	if (*ppName!=NullString) 
X	    found=	True;
X    }
X    uRETURN(found);
X}
X
X/***====================================================================***/
X
Xvoid
XxrnNoteAppName(win,name)
XWindow	win;
Xchar	*name;
X{
X    uENTRY2("xrnNoteAppName(0x%x,%s)\n",win,uStringText(name));
X
X    if (xrnAppNameAtom!=None) {
X	XChangeProperty(xroomsDpy,win,xrnAppNameAtom,XA_STRING,8,
X					PropModeReplace,
X					name,strlen(name));
X        XFlush(xroomsDpy);
X    }
X    uVOIDRETURN;
X}
X
X/***====================================================================***/
X
XBoolean
XxrnHaveProfile()
X{
X    uENTRY("xrnHaveProfile()\n");
X    if (nprLookupFunction(xrnNameLookup)!=NullNPStatement) {
X	uRETURN(True);
X    }
X    uRETURN(False);
X}
X
X/***====================================================================***/
X
Xvoid
XxrnInit()
X{
X    uENTRY("xrnInit()\n");
X    nprSetResolver(xrnResolveNames);
X    nprSetChanger(xrnChangeNamed);
X    uVOIDRETURN;
X}
END_OF_FILE
if test 6268 -ne `wc -c <'./xrooms/xrNames.c'`; then
    echo shar: \"'./xrooms/xrNames.c'\" unpacked with wrong size!
fi
# end of './xrooms/xrNames.c'
fi
if test -f './xrooms/xrProfile.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'./xrooms/xrProfile.c'\"
else
echo shar: Extracting \"'./xrooms/xrProfile.c'\" \(5999 characters\)
sed "s/^X//" >'./xrooms/xrProfile.c' <<'END_OF_FILE'
X
X  /*\
X   *  $Header: xrProfile.c,v 5.0 90/01/10 07:01:06 erik Exp $
X   *
X   *		              COPYRIGHT 1990
X   *		        DIGITAL EQUIPMENT CORPORATION
X   *		           MAYNARD, MASSACHUSETTS
X   *			    ALL RIGHTS RESERVED.
X   *
X   * THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE AND
X   * SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT CORPORATION.
X   * DIGITAL MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS SOFTWARE 
X   * FOR ANY PURPOSE.  IT IS SUPPLIED "AS IS" WITHOUT EXPRESS OR IMPLIED 
X   * WARRANTY.
X   *
X   * IF THE SOFTWARE IS MODIFIED IN A MANNER CREATING DERIVATIVE COPYRIGHT
X   * RIGHTS, APPROPRIATE LEGENDS MAY BE PLACED ON THE DERIVATIVE WORK IN
X   * ADDITION TO THAT SET FORTH ABOVE.
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 appear in all copies and that both that
X   * copyright notice and this permission notice appear in supporting
X   * documentation, and that the name of Digital Equipment Corporation not be
X   * used in advertising or publicity pertaining to distribution of the 
X   * software without specific, written prior permission.
X  \*/
X
X#include <X11/Xlib.h>
X#include <X11/cursorfont.h>
X#include <X11/Xutil.h>
X
X#define	DEBUG_VAR	xrProfileDebug
X#include "utils.h"
X#include "hash.h"
X#include "appstate.h"
X#include "profscan.h"
X
X#include "xrDebug.h"
X#include "xrooms.h"
X#include "xrProfile.h"
X
X/***====================================================================***/
X
XBoolean		 xrpfAutoSaveNew=	True;
XBoolean		 xrpfSaveRoomProfiles=	False;
XBoolean		 xrpfBackupConfig=	False;
Xchar		*xrpfConfigFile=	NULL;
X
X/***====================================================================***/
X
Xstatic FILE *
XxrpfFindFileToRead()
X{
XFILE	*file= NULL;
Xchar	*home;
Xchar	 buf[256];
X
X    uENTRY("xrpfFindFileToRead()\n");
X    if (xrpfConfigFile!=NullString) {
X	file= fopen(xrpfConfigFile,"r");
X	if (file==NULL) {
X	    uWarning("Can't open \"%s\" to read defaults\n",xrpfConfigFile);
X	}
X	uRETURN(file);
X    }
X    if ((file==NULL)&&((home=(char *)getenv("HOME"))!=NULL)) {
X	sprintf(buf,"%s/.xroomsrc",home);
X	file= fopen(buf,"r");
X	if (file==NULL) {
X	    sprintf(buf,"%s/.xrooms.init",home);
X	    file= fopen(buf,"r");
X	    if (file!=NULL) {
X		uWarning("Intializing from .xrooms.init, which is obsolete\n");
X		uAction("defaults will be saved to your .xroomsrc\n");
X	    }
X	}
X    }
X    if (file==NULL) {
X	file= fopen("/usr/lib/X11/system.xroomsrc","r");
X	if (file!=NULL) {
X	    uWarning("Loading from /usr/lib/X11/system.xroomsrc\n");
X	    uAction("defaults will be saved to your .xroomsrc\n");
X	}
X    }
X    if (file==NULL) {
X	file= fopen("/usr/local/lib/X11/system.xroomsrc","r");
X	if (file!=NULL) {
X	    uWarning("Loading from /usr/local/lib/X11/system.xroomsrc\n");
X	    uAction("defaults will be saved to your .xroomsrc\n");
X	}
X    }
X    if (file==NULL) {
X	uWarning("Couldn't find a config file anywhere\n");
X	if (xroomsSetupMode)	
X	     uAction("Trying some heuristics for defaults\n");
X	else uAction("No defaults\n");
X    }
X    uRETURN(file);
X}
X
X/***====================================================================***/
X
XBoolean
XxrpfLoadString(str)
Xchar	*str;
X{
XBoolean	ok=	True;
X
X    uENTRY1("xrpfLoadString(%20s)\n",uStringText(str));
X    if (str!=NullString) {
X	ScannablePtr	pScan;
X	
X	pScan=	scannableOpen(scannableString,(Opaque)str);
X	if (pScan!=NullScannable) {
X	    if (!profileRead(pScan)) {
X		uWarning("Error reading config file\n");
X		ok= False;
X	    }
X	    scannableClose(pScan);
X	}
X	uRETURN(ok);
X    }
X    uRETURN(False);
X}
X
X/***====================================================================***/
X
XBoolean
XxrpfLoadFile(fileName)
Xchar	*fileName;
X{
XFILE	*file= NULL;
XBoolean	 ok= False;
X
X    uENTRY1("xrpfLoadFile(%s)\n",uStringText(fileName));
X    if (fileName==NullString) {
X	file=	xrpfFindFileToRead();
X    }
X    else {
X	file=	fopen(fileName,"r");
X	if (file==NULL) {
X	    uWarning("Couldn't load config file %s\n",fileName);
X	    uAction("profile not loaded\n");
X	}
X    }
X    if (file!=NULL) {
X	ScannablePtr	pScan;
X	
X	pScan=	scannableOpen(scannableFile,(Opaque)file);
X	if (pScan!=NullScannable) {
X	    if (!profileRead(pScan)) {
X		uWarning("Error reading config file\n");
X	    }
X	    else ok=	True;
X	    scannableClose(pScan);
X	}
X	fclose(file);
X    }
X    uRETURN(ok);
X}
X
X/***====================================================================***/
X
Xstatic FILE *
XxrpfFindFileToWrite()
X{
XFILE	*file;
Xchar	*home;
Xchar	buf[256];
X
X    uENTRY("xrpfFindFileToWrite()\n");
X    if (xrpfConfigFile==NullString) {
X	home= (char *)getenv("HOME");
X	sprintf(buf,"%s/.xroomsrc",home);
X	xrpfConfigFile=	uStringDup(buf);
X    }
X    if (xrpfConfigFile!=NullString) {
X	if (xrpfBackupConfig) {
X	    sprintf(buf,"%s.bak",xrpfConfigFile);
X	    unlink(buf);
X	    rename(xrpfConfigFile,buf);
X	}
X	file= fopen(xrpfConfigFile,"w");
X	if (xrpfBackupConfig) {
X	    if (file==(FILE *)NULL) {
X		rename(buf,xrpfConfigFile);
X	    }
X	    xrpfBackupConfig=	False;
X	}
X    }
X    if (file==NULL) {
X	char *user=	(char *)getenv("USER");
X	if (user!=NULL)	sprintf(buf,"/usr/tmp/xroomsrc.%s",user);
X	else		sprintf(buf,"/usr/tmp/xroomsrc.tmp");
X	uWarning("Couldn't write to config file\n");
X	file= fopen(buf,"w");
X	if (file!=NULL)	uAction("saving profile to %s\n",buf);
X	else		uAction("profile not saved\n");
X    }
X    uRETURN(file);
X}
X
X/***====================================================================***/
X
Xvoid
XxrpfSaveProfiles(fileName)
Xchar	*fileName;
X{
XFILE		*file;
X
X    uENTRY1("xrpfSaveProfiles(%s)\n",uStringText(fileName));
X    if (fileName==NULL) {
X	file= xrpfFindFileToWrite();
X    }
X    else {
X	file= fopen(fileName,"w");
X	if (file==NULL) {
X	    uWarning("Couldn't open %s to save profiles\n",fileName);
X	    uAction("profiles not saved\n");
X	}
X    }
X    if (file!=NULL) {
X	(void)profileWrite(file,xrpfSaveRoomProfiles);
X	fclose(file);
X	xroomsSetupMode=	False;
X    }
X    uVOIDRETURN;
X}
X
END_OF_FILE
if test 5999 -ne `wc -c <'./xrooms/xrProfile.c'`; then
    echo shar: \"'./xrooms/xrProfile.c'\" unpacked with wrong size!
fi
# end of './xrooms/xrProfile.c'
fi
echo shar: End of archive 3 \(of 14\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 14 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



More information about the Comp.sources.x mailing list