v05i057: Xrooms -- A Rooms implementation for X, Part07/14
Kent Landfield
kent at ssbell.IMD.Sterling.COM
Mon Jan 15 17:10:32 AEST 1990
Submitted-by: wsl.dec.com!mikey (Mike Yang)
Posting-number: Volume 5, Issue 57
Archive-name: xrooms/part07
#! /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 7 (of 14)."
# Contents: ./lib/apps.c ./utils/hash.c ./xrooms/xrSetup.c
# ./xrset/xrReq.c
# Wrapped by kent at ssbell on Sun Jan 14 21:57:56 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f './lib/apps.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./lib/apps.c'\"
else
echo shar: Extracting \"'./lib/apps.c'\" \(12698 characters\)
sed "s/^X//" >'./lib/apps.c' <<'END_OF_FILE'
X
X /*\
X * $Header: apps.c,v 5.2 90/01/11 13:41:55 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 appsDebug
X#include "utils.h"
X#include "hash.h"
X#include "strtbl.h"
X#include "rooms.h"
X#include "apps.h"
X#include "profile.h"
X
X/***====================================================================***/
X
XHashTablePtr pAllApps= NullHashTable;
XHashTablePtr pActiveApps= NullHashTable;
X
Xchar *AppInstanceFormat= "%s-%d";
X
X/***====================================================================***/
X
Xvoid
XDebugPrintApps(name)
Xchar *name;
X{
XAppPtr pApp;
XOpaque astate;
X
X if (pAllApps!=NullHashTable) {
X if (name==NullString) {
X uDebug("All Apps:\n");
X uDebugIndent(1);
X AppsIterator(AllApps,pApp,astate) {
X uDebug("%s (0x%x)\n",appText(pApp),pApp);
X appDebugPrint(pApp);
X }
X AppsEndIterator(astate);
X uDebugIndent(-1);
X uDebug("ActiveApps:\n");
X uDebugIndent(1);
X AppsIterator(ActiveApps,pApp,astate) {
X uDebug("%s (0x%x)\n",appText(pApp),pApp);
X }
X AppsEndIterator(astate);
X uDebugIndent(-1);
X }
X else {
X StringToken token;
X if (stGetTokenIfExists(name,&token)) {
X AppPtr pApp= (AppPtr)htLookup(pAllApps,(GenKey)token);
X if (pApp!=NullApp) {
X uDebug("%s (0x%x)\n",appText(pApp),pApp);
X appDebugPrint(pApp);
X }
X else uDebug("App %s doesn't exist\n",stText(token));
X }
X else uDebug("token %s undefined\n",uStringText(name));
X }
X }
X else {
X uDebug("No apps defined\n");
X }
X return;
X}
X
X/***====================================================================***/
X
XAppPtr
XLookupApp(name)
XStringToken name;
X{
XAppPtr pApp= NullApp;
X
X uENTRY1("LookupApp(%s)\n",stText(name));
X if (pAllApps!=NullHashTable) {
X pApp= (AppPtr)htLookup(pAllApps,(GenKey)name);
X }
X uRETURN(pApp);
X}
X
X/***====================================================================***/
X
XAppPtr
XLookupActiveApp(name)
XStringToken name;
X{
XAppPtr pApp= NullApp;
X
X uENTRY1("LookupActiveApp(%s)\n",stText(name));
X if (pActiveApps!=NullHashTable) {
X pApp= (AppPtr)htLookup(pActiveApps,(GenKey)name);
X }
X uRETURN(pApp);
X}
X
X/***====================================================================***/
X
XAppPtr
XGetApp(name,onlyInactive)
XStringToken name;
XBoolean onlyInactive;
X{
XAppPtr pApp;
Xchar *oldName;
Xchar *tmpBuf= NullString;
Xint count= 1;
XBoolean done;
X
X uENTRY2("GetApp(%s,%s)\n",stText(name),booleanText(onlyInactive));
X
X if (pAllApps==NullHashTable) {
X pAllApps= htCreate((unsigned)71,genIntegerKeyType,
X genPointerDataType);
X }
X if ((pAllApps==NullHashTable)||(name==NullStringToken)) {
X uRETURN(NullApp);
X }
X
X done= False;
X do {
X pApp= (AppPtr)htLookup(pAllApps,(GenKey)name);
X if (pApp!=NullApp) {
X if (onlyInactive&&appIsActive(pApp)) {
X if (tmpBuf==NullString) {
X oldName= stGetString(name);
X tmpBuf= (char *)uTmpAlloc(strlen(oldName)+24);
X if (tmpBuf==NullString) {
X uRETURN(NullApp);
X }
X }
X sprintf(tmpBuf,AppInstanceFormat,oldName,count++);
X name= stGetToken(tmpBuf);
X }
X else {
X done= True;
X }
X }
X else {
X pApp= appCreate(name,NullAppState,NullAppState);
X if (pApp!=NullApp) {
X (void)htAdd(pAllApps,(GenKey)name,(GenData)pApp);
X (void)profileForApp(name);
X }
X else {
X uWarning("Couldn't create app %s\n",stText(name));
X }
X done= True;
X }
X } while (!done);
X
X if (tmpBuf!=NullString) {
X uTmpFree(NullString);
X }
X uRETURN(pApp);
X}
X
X/***====================================================================***/
X
X/* ARGSUSED */
Xstatic Boolean
X_CreateAppRooms(pApp,roomName,pState,pArg)
XAppPtr pApp;
XStringToken roomName;
XAppStatePtr pState;
XOpaque pArg;
X{
X uENTRY4("_CreateAppRooms(%s,%s,%s,0x%x)\n",appText(pApp),stText(roomName),
X asText(pState),pArg);
X (void)CreateRoom(roomName);
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XAppActivated(pApp, pRealState)
XAppPtr pApp;
XAppStatePtr pRealState;
X{
XBoolean permanent;
XOpaque rstate;
XRoomPtr pRoom;
X
X uENTRY2("AppActivated(%s,%s)\n",appText(pApp),asText(pRealState));
X if ((pApp==NullApp)||(!asLegalReal(pRealState))||
X (asWinState(pRealState)==asInactive)||
X (pAllApps==NullHashTable)) {
X uRETURN(False);
X }
X if (appIsActive(pApp)) {
X uRETURN(False);
X }
X
X if (pActiveApps==NullHashTable) {
X pActiveApps=htCreate((unsigned)51,genIntegerKeyType,genPointerDataType);
X if (pActiveApps==NullHashTable) {
X uRETURN(False);
X }
X }
X
X if (permanent=appIsPermanent(pApp)) {
X (void)appIterate(pApp,_CreateAppRooms,(Opaque)NULL);
X }
X (void)appSetCurrent(pApp,pRealState,True);
X if (!permanent) {
X RoomPtr pRoom= GetCurrentRoom();
X AppStatePtr pState;
X if (asWinState(pRealState)==asNormal) {
X pState= appSetDefault(pApp,pRealState,False);
X if (pRoom!=NullRoom) {
X appSetRoomState(pApp,roomName(pRoom),pRealState,False);
X }
X if (pState!=NullAppState) {
X asChangeSelected(pState,asWinStateValue,asIconic,0,0,
X (unsigned)0,(unsigned)0);
X }
X }
X else if (asWinState(pRealState)==asIconic) {
X pState= appSetDefault(pApp,pRealState,False);
X }
X else if (asWinState(pRealState)==asWithdrawn) {
X pState= asDupFully(pRealState);
X if (pState!=NullAppState) {
X asChangeSelected(pState,asWinStateValue,asIconic,0,0,
X (unsigned)0,(unsigned)0);
X appSetDefault(pApp,pState,False);
X asDestroy(pState);
X }
X }
X }
X (void)htAdd(pActiveApps,(GenKey)appName(pApp),(GenData)pApp);
X
X RoomsIterator(pRoom,rstate) {
X roomManageApp(pRoom,pApp);
X }
X RoomsEndIterator(rstate);
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XAppDeactivated(pApp)
XAppPtr pApp;
X{
XOpaque rstate;
XRoomPtr pRoom;
XAppPtr pOldApp;
X
X uENTRY1("_AppDeactivated(%s)\n",appText(pApp));
X if ((pApp==NullApp)||(pActiveApps==NullHashTable)) {
X uRETURN(False);
X }
X if (!appIsActive(pApp)) {
X uRETURN(False);
X }
X (void)appSetCurrent(pApp,asDefaultReal,True);
X
X RoomsIterator(pRoom,rstate) {
X roomUnmanageApp(pRoom,pApp);
X }
X RoomsEndIterator(rstate);
X
X pOldApp= (AppPtr)htRemove(pActiveApps,(GenKey)appName(pApp));
X if (pOldApp!=pApp) {
X uInternalError("deactivated %s(0x%x), expected %s(0x%x)\n",
X appText(pOldApp),pOldApp,
X appText(pApp),pApp);
X uRETURN(False);
X }
X if (!appIsPermanent(pApp)) {
X pOldApp= (AppPtr)htRemove(pAllApps,(GenKey)appName(pApp));
X if (pOldApp!=pApp) {
X uInternalError("destroyed %s(0x%x), expected %s(0x%x)\n",
X appText(pOldApp),pOldApp,
X appText(pApp),pApp);
X }
X profileForAppDestroy(appName(pApp));
X appDestroy(pApp);
X }
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XSetAppRoomState(pApp, pRoom, pNewState)
XAppPtr pApp;
XRoomPtr pRoom;
XAppStatePtr pNewState;
X{
X
X uENTRY3("SetAppRoomState(%s,%s,%s)\n",appText(pApp),roomText(pRoom),
X asText(pNewState));
X if (pRoom==NullRoom)
X pRoom= GetCurrentRoom();
X if ((pApp==NullApp)||(pNewState==NullAppState)||(pRoom==NullRoom)||
X (!asLegalReal(pNewState))) {
X uRETURN(False);
X }
X if (!appIsActive(pApp)) {
X if(appSetRoomState(pApp,roomName(pRoom),pNewState,False)==NullAppState){
X uRETURN(False);
X }
X }
X else {
X Boolean ok= roomChangeAppLocalState(pRoom,pApp,pNewState);
X uRETURN(ok);
X }
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XSetAppPermanence(pApp,permanent)
XAppPtr pApp;
XBoolean permanent;
X{
XBoolean ok= True;
X
X uENTRY2("SetAppPermanence(%s,%s)\n",appText(pApp),booleanText(permanent));
X if (pApp==NullApp) {
X uRETURN(False);
X }
X if ((permanent)&&(!appIsPermanent(pApp))) {
X ok= profileForApp(appName(pApp));
X ok= appSetPermanence(pApp,True)&&ok;
X }
X else if ((!permanent)&&(appIsPermanent(pApp))) {
X ok= appSetPermanence(pApp,False);
X }
X uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
XAppStateChanged(pApp, pNewState)
XAppPtr pApp;
XAppStatePtr pNewState;
X{
XRoomPtr pRoom;
X
X uENTRY2("AppStateChanged(%s,%s)\n",appText(pApp),asText(pNewState));
X if ((pApp==NullApp)||(pNewState==NullAppState)||
X (asWinState(pNewState)==asInactive)) {
X uRETURN(False);
X }
X if (!appIsActive(pApp)) {
X uRETURN(False);
X }
X
X if (appSetCurrent(pApp,pNewState,True)!=NullAppState) {
X if (asWinState(pNewState)!=asWithdrawn) {
X pRoom= GetCurrentRoom();
X if (pRoom!=NullRoom) {
X (void)roomAppRealStateChanged(pRoom,pApp,pNewState);
X }
X }
X uRETURN(True);
X }
X uRETURN(False);
X}
X
X/***====================================================================***/
X
Xstatic AppsIterFunc appsIterFunc;
X
Xstatic Boolean
X_AppsIterator(row,keyIn,dataIn,arg)
Xunsigned row;
XGenKey keyIn;
XGenData dataIn;
XOpaque arg;
X{
XStringToken key= (StringToken)keyIn;
XAppPtr pApp= (AppPtr)dataIn;
XBoolean ok;
X
X uENTRY4("_AppsIterator(%d,%s,%s,0x%x)\n",row,stText(key),appText(pApp),arg);
X ok= (*appsIterFunc)(arg,pApp);
X uRETURN(ok);
X}
X
Xvoid
XAppsIterate(func,arg)
XAppsIterFunc func;
XOpaque arg;
X{
X uENTRY2("AppsIterate(0x%x,0x%x)\n",func,arg);
X if ((func==NULL)||(pAllApps==NullHashTable)) {
X uVOIDRETURN;
X }
X appsIterFunc= func;
X (void)htIterate(pAllApps,_AppsIterator,arg);
X uVOIDRETURN;
X}
X
Xvoid
XActiveAppsIterate(func,arg)
XAppsIterFunc func;
XOpaque arg;
X{
X uENTRY2("AppsIterate(0x%x,0x%x)\n",func,arg);
X if ((func==NULL)||(pActiveApps==NullHashTable)) {
X uVOIDRETURN;
X }
X appsIterFunc= func;
X (void)htIterate(pActiveApps,_AppsIterator,arg);
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xstruct appsIterState {
X HashTablePtr pTbl;
X Opaque tblState;
X} iState;
X
XBoolean
X_AppsInitIter(which,pOutState)
Xunsigned which;
XOpaque *pOutState;
X{
XBoolean ok= False;
XHashTablePtr pTbl;
XOpaque tblState;
Xstruct appsIterState *pState;
X
X uENTRY2("_AppsInitIter(%d,0x%x)\n",which,pOutState);
X if ((which==ActiveApps)&&(pActiveApps!=NullHashTable)) {
X pTbl= pActiveApps;
X ok= _htInitIter(pActiveApps,&tblState);
X }
X else if ((which==AllApps)&&(pAllApps!=NullHashTable)) {
X pTbl= pAllApps;
X ok= _htInitIter(pAllApps,&tblState);
X }
X if (ok) {
X if (iState.pTbl==NullHashTable)
X pState= &iState;
X else pState= uTypedAlloc(struct appsIterState);
X if (pState!=(struct appsIterState *) NULL) {
X pState->pTbl= pTbl;
X pState->tblState= tblState;
X *pOutState= (Opaque)pState;
X }
X else ok= False;
X }
X if (!ok)
X *pOutState= (Opaque)NULL;
X uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
X_AppsIterNext(pInState, ppApp)
XOpaque pInState;
XAppPtr *ppApp;
X{
XBoolean ok= False;
XGenKey key;
XGenData data;
Xstruct appsIterState *pState= (struct appsIterState *)pInState;
X
X uENTRY2("_AppsIterNext(0x%x,0x%x)\n",pInState,ppApp);
X if (pInState!=(Opaque)NULL) {
X ok= _htIterNext(pState->pTbl,pState->tblState,&key,&data);
X if (ok) {
X *ppApp= (AppPtr)data;
X }
X else *ppApp= NullApp;
X }
X uRETURN(ok);
X}
X
X/***====================================================================***/
X
Xvoid
XAppsEndIterator(state)
XOpaque state;
X{
Xstruct appsIterState *pState= (struct appsIterState *)state;
X
X uENTRY1("AppsEndIterator(0x%x)\n",state);
X if (state!=(Opaque)NULL) {
X htEndIterator(pState->pTbl,pState->tblState);
X pState->pTbl= NullHashTable;
X pState->tblState= (Opaque)NULL;
X if (pState!=&iState) {
X (void)uFree((Opaque)pState);
X }
X }
X uVOIDRETURN;
X}
END_OF_FILE
if test 12698 -ne `wc -c <'./lib/apps.c'`; then
echo shar: \"'./lib/apps.c'\" unpacked with wrong size!
fi
# end of './lib/apps.c'
fi
if test -f './utils/hash.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./utils/hash.c'\"
else
echo shar: Extracting \"'./utils/hash.c'\" \(13112 characters\)
sed "s/^X//" >'./utils/hash.c' <<'END_OF_FILE'
X
X /*\
X * $Header: hash.c,v 5.0 90/01/10 06:50:45 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 hashDebug
X
X#include "utils.h"
X#include "hashstr.h"
X
X/***====================================================================***/
X
X#define _htHash(pt,k) ((pt)->hashFunc?(*(pt)->hashFunc)(k):(unsigned)(k))
X#define _htCompareKey(pt,k1,k2) (_genCompareKey((pt)->keyType,k1,k2))
X#define _htStoreKey(pt,k) (_genStoreKey((pt)->keyType,k))
X#define _htRemoveKey(pt,k) _genRemoveKey((pt)->keyType,k)
X#define _htNullKey(pt) (_genNullKey((pt)->keyType))
X
X#define _htStoreData(pt,d) (_genStoreData((pt)->dataType,d))
X#define _htReplaceData(pt,nd,pod) (_genReplaceData((pt)->dataType,nd,pod))
X#define _htRemoveData(pt,d) (_genRemoveData((pt)->dataType,d))
X#define _htNullData(pt) (_genNullData((pt)->dataType))
X
X/***====================================================================***/
X
XHashTablePtr
XhtCreate(size,keyType,dataType)
Xunsigned size;
XGenKeyDescPtr keyType;
XGenDataDescPtr dataType;
X{
XHashTablePtr pTbl;
X
X uENTRY3("htCreate(%d,0x%x,0x%x)\n",size,keyType,dataType);
X
X if (size<1) uRETURN(NULL);
X if (keyType==NULL) keyType= genDefaultKeyType;
X if (dataType==NULL) dataType= genDefaultDataType;
X
X uASSERT("htCreate",((keyType!=NULL)&&(dataType!=NULL)))
X
X pTbl= uTypedAlloc(HashTableRec);
X if (pTbl!=NULL) {
X pTbl->hashFunc= keyType->dfltHash;
X pTbl->keyType= keyType;
X pTbl->dataType= dataType;
X
X pTbl->nStored= 0;
X pTbl->nBuckets= size;
X pTbl->ppBuckets= uTypedCalloc(size,HashBucketPtr);
X if (pTbl->ppBuckets==NULL) {
X uFree((Opaque)pTbl);
X uRETURN(NULL);
X }
X }
X uRETURN(pTbl);
X}
X
X/***====================================================================***/
X
Xvoid
XhtDestroy(pTbl)
XHashTablePtr pTbl;
X{
Xint i;
XHashBucketPtr pBkt,pNext;
X
X uENTRY1("htDestroy(0x%x)\n",pTbl);
X
X if ((pTbl==NULL)||(pTbl->ppBuckets==NULL))
X uVOIDRETURN;
X
X if (pTbl->nStored>0) {
X for (i=0;i<pTbl->nBuckets;i++) {
X pBkt= pTbl->ppBuckets[i];
X pTbl->ppBuckets[i]= NULL;
X while (pBkt!=NULL) {
X pNext= pBkt->next;
X _htRemoveKey(pTbl,pBkt->key);
X (void)_htRemoveData(pTbl,pBkt->data);
X pBkt->next= NULL;
X uFree((Opaque)pBkt);
X pTbl->nStored--;
X pBkt= pNext;
X }
X }
X }
X uASSERT("htDestroy",pTbl->nStored==0);
X uFree((Opaque)pTbl->ppBuckets);
X pTbl->ppBuckets= NULL;
X uFree((Opaque)pTbl);
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
XGenData
XhtAdd(pTbl,key,data)
XHashTablePtr pTbl;
XGenKey key;
XGenData data;
X{
Xunsigned index;
XHashBucketPtr pBkt;
X
X uENTRY3("htAdd(0x%x,0x%x,0x%x)\n",pTbl,key,data);
X
X if (pTbl==NULL) {
X uRETURN((GenData)NULL);
X }
X
X uASSERT("htAdd",pTbl->nBuckets>0);
X
X index= _htHash(pTbl,key)%pTbl->nBuckets;
X
X pBkt= pTbl->ppBuckets[index];
X
X while (pBkt!=NULL) { /* search through bucket list for match */
X if (_htCompareKey(pTbl,key,pBkt->key)==Equal) break;
X pBkt= pBkt->next;
X }
X
X if (pBkt==NULL) { /* no matching bucket, add */
X pBkt= uTypedAlloc(HashBucketRec);
X if (pBkt==NULL) { /* alloc failed */
X uRETURN(pTbl->dataType->null);
X }
X pBkt->key= _htStoreKey(pTbl,key);
X pBkt->data= _htStoreData(pTbl,data);
X pBkt->next= pTbl->ppBuckets[index];
X pTbl->ppBuckets[index]= pBkt;
X pTbl->nStored++;
X uRETURN(_htNullData(pTbl));
X }
X else { /* matching bucket, replace */
X GenData oldData= pBkt->data;
X
X pBkt->data= _htReplaceData(pTbl,data,&oldData);
X uRETURN(oldData);
X }
X}
X
X/***====================================================================***/
X
XGenData
XhtLookup(pTbl,key)
XHashTablePtr pTbl;
XGenKey key;
X{
Xunsigned index;
XHashBucketPtr pBkt;
X
X uENTRY2("htLookup(0x%x,0x%x)\n",pTbl,key);
X
X if (pTbl==NULL) {
X uRETURN((GenData)NULL);
X }
X
X uASSERT("htLookup",pTbl->nBuckets>0);
X
X index= _htHash(pTbl,key)%pTbl->nBuckets;
X
X pBkt= pTbl->ppBuckets[index];
X
X while (pBkt!=NULL) { /* search through bucket list for match */
X if (_htCompareKey(pTbl,key,pBkt->key)==Equal) break;
X pBkt= pBkt->next;
X }
X if (pBkt!=NULL) {
X uRETURN(pBkt->data);
X }
X uRETURN(_htNullData(pTbl));
X}
X
X/***====================================================================***/
X
XGenData
XhtRemove(pTbl,key)
XHashTablePtr pTbl;
XGenKey key;
X{
Xunsigned index;
XHashBucketPtr pBkt,pLast;
XGenData oldData;
X
X uENTRY2("htRemove(0x%x,0x%x)\n",pTbl,key);
X if (pTbl==NULL)
X uRETURN((GenData)NULL);
X
X uASSERT("htRemove",pTbl->nBuckets>0);
X
X index= _htHash(pTbl,key)%pTbl->nBuckets;
X
X pBkt= pTbl->ppBuckets[index];
X
X pLast= (HashBucketPtr)NULL;
X while (pBkt!=NULL) { /* search through bucket list for match */
X if (_htCompareKey(pTbl,key,pBkt->key)==Equal) break;
X pLast= pBkt;
X pBkt= pBkt->next;
X }
X if (pBkt!=NULL) {
X _htRemoveKey(pTbl,pBkt->key);
X oldData= _htRemoveData(pTbl,pBkt->data);
X if (pLast) pLast->next= pBkt->next;
X else pTbl->ppBuckets[index]= pBkt->next;
X pBkt->next= NULL;
X uFree((Opaque)pBkt);
X pTbl->nStored--;
X uRETURN(oldData);
X }
X uRETURN(_htNullData(pTbl));
X}
X
X/***====================================================================***/
X
Xint
XhtSize(pTbl)
XHashTablePtr pTbl;
X{
X uENTRY1("htSize(0x%x)\n",pTbl);
X uRETURN(pTbl->nBuckets);
X}
X
X/***====================================================================***/
X
Xint
XhtNumStored(pTbl)
XHashTablePtr pTbl;
X{
X uENTRY1("htNumStored(0x%x)\n",pTbl);
X uRETURN(pTbl->nStored);
X}
X
X/***====================================================================***/
X
XBoolean
XhtResize(pTbl,newSize)
XHashTablePtr pTbl;
Xint newSize;
X{
Xint i,newI,nMoved;
XHashBucketPtr *ppNewBuckets;
XHashBucketPtr pBkt,pNext;
X
X uENTRY2("htResize(0x%x,%d)\n",pTbl,newSize);
X
X if ((pTbl==NULL)||(newSize<1))
X uRETURN(False);
X if (pTbl->nBuckets==newSize)
X uRETURN(True);
X
X uASSERT("htResize",pTbl->nBuckets>0);
X
X ppNewBuckets= uTypedCalloc(newSize,HashBucketPtr);
X if (ppNewBuckets==NULL)
X uRETURN(False);
X
X for (nMoved=i=0;i<pTbl->nBuckets;i++) {
X pBkt= pTbl->ppBuckets[i];
X while (pBkt) {
X pNext= pBkt->next;
X newI= _htHash(pTbl,pBkt->key)%newSize;
X pBkt->next= ppNewBuckets[newI];
X ppNewBuckets[newI]= pBkt;
X pBkt= pNext;
X nMoved++;
X }
X pTbl->ppBuckets[i]= NULL;
X }
X uASSERT("htResize",nMoved==pTbl->nStored);
X uFree((Opaque)pTbl->ppBuckets);
X pTbl->nBuckets= newSize;
X pTbl->ppBuckets= ppNewBuckets;
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XhtConvertKeys(pTbl, cvtFunc, newKeyType)
XHashTablePtr pTbl;
XKeyConvertFunc cvtFunc;
XGenKeyDescPtr newKeyType;
X{
Xint i,newI,nChanged;
XHashBucketPtr *ppNewBuckets;
XHashBucketPtr pBkt,pNext;
XGenKey oldKey;
X
X uENTRY3("htConvertKeys(0x%x,0x%x,0x%x)\n",pTbl,cvtFunc,newKeyType);
X if ((pTbl==NULL)||(cvtFunc==NULL))
X uRETURN(False);
X
X if (newKeyType==NULL)
X newKeyType= genDefaultKeyType;
X
X if (pTbl->keyType==newKeyType)
X uRETURN(True);
X
X uASSERT("htConvertKeys",pTbl->nBuckets>0);
X
X ppNewBuckets= uTypedCalloc(pTbl->nBuckets,HashBucketPtr);
X if (ppNewBuckets==NULL)
X uRETURN(False);
X
X pTbl->keyType= newKeyType;
X for (nChanged=i=0;i<pTbl->nBuckets;i++) {
X pBkt= pTbl->ppBuckets[i];
X while (pBkt) {
X pNext= pBkt->next;
X oldKey= pBkt->key;
X pBkt->key= (*cvtFunc)(oldKey);
X newI= _htHash(pTbl,pBkt->key)%pTbl->nBuckets;
X pBkt->next= ppNewBuckets[newI];
X ppNewBuckets[newI]= pBkt;
X pBkt= pNext;
X nChanged++;
X }
X pTbl->ppBuckets[i]= NULL;
X }
X uASSERT("htConvertKeys",nChanged==pTbl->nStored);
X uFree((Opaque)pTbl->ppBuckets);
X pTbl->ppBuckets= ppNewBuckets;
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XhtConvertData( pTbl, cvtFunc, newDataType )
XHashTablePtr pTbl;
XDataConvertFunc cvtFunc;
XGenDataDescPtr newDataType;
X{
Xint i,nChanged;
XHashBucketPtr pBkt;
X
X uENTRY3("htConvertData(0x%x,0x%x,0x%x)\n",pTbl,cvtFunc,newDataType);
X if ((pTbl==NULL)||(cvtFunc==NULL))
X uRETURN(False);
X
X if (newDataType==NULL)
X newDataType= genDefaultDataType;
X
X if (pTbl->dataType==newDataType)
X uRETURN(True);
X
X uASSERT("htConvertData",pTbl->nBuckets>0);
X
X pTbl->dataType= newDataType;
X for (nChanged=i=0;i<pTbl->nBuckets;i++) {
X pBkt= pTbl->ppBuckets[i];
X while (pBkt!=NULL) {
X pBkt->data= (*cvtFunc)(pBkt->data);
X pBkt= pBkt->next;
X nChanged++;
X }
X }
X uASSERT("htConvertData",nChanged==pTbl->nStored);
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XhtChangeHashFunc(pTbl, newHash)
XHashTablePtr pTbl;
XHashFunc newHash;
X{
Xint i,newI,nChanged;
XHashBucketPtr pBkt,pNext;
XHashBucketPtr *ppNewBuckets;
X
X uENTRY2("htChangeHashFunc(0x%x,0x%x)\n",pTbl,newHash);
X if (pTbl==NULL)
X uRETURN(False);
X
X if (newHash==NULL)
X newHash= pTbl->keyType->dfltHash;
X
X if (pTbl->hashFunc==newHash)
X uRETURN(True);
X
X uASSERT("htChangeHashFunc",pTbl->nBuckets>0);
X
X ppNewBuckets= uTypedCalloc(pTbl->nBuckets,HashBucketPtr);
X if (ppNewBuckets==NULL)
X uRETURN(False);
X
X pTbl->hashFunc= newHash;
X for (nChanged=i=0;i<pTbl->nBuckets;i++) {
X pBkt= pTbl->ppBuckets[i];
X while (pBkt) {
X pNext= pBkt->next;
X newI= _htHash(pTbl,pBkt->key)%pTbl->nBuckets;
X pBkt->next= ppNewBuckets[newI];
X ppNewBuckets[newI]= pBkt;
X pBkt= pNext;
X nChanged++;
X }
X }
X uASSERT("htChangeHashFunc",nChanged==pTbl->nStored);
X uFree((Opaque)pTbl->ppBuckets);
X pTbl->ppBuckets= ppNewBuckets;
X uRETURN(True);
X}
X
X/***====================================================================***/
X
Xvoid
XhtIterate(pTbl, pFunc, arg)
XHashTablePtr pTbl;
XHashIterFunc pFunc;
XOpaque arg;
X{
XHashBucketPtr pBkt;
Xint i,nSeen;
X
X uENTRY3("htIterate(0x%x,0x%x,0x%x)\n",pTbl,pFunc,arg);
X if ((!pTbl)||(!pFunc))
X uVOIDRETURN;
X
X for (nSeen=i=0;i<pTbl->nBuckets;i++) {
X pBkt= pTbl->ppBuckets[i];
X while (pBkt) {
X if (!(*pFunc)(i,pBkt->key,pBkt->data,arg)) {
X uVOIDRETURN;
X }
X pBkt= pBkt->next;
X nSeen++;
X }
X }
X uASSERT("htIterate",nSeen==pTbl->nStored);
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xstatic struct htIterState {
X int index;
X HashBucketPtr pBkt;
X} iState= { -1, NULL };
X
XBoolean
X_htInitIter(pTbl, pOutState)
XHashTablePtr pTbl;
XOpaque *pOutState;
X{
Xstruct htIterState *pState;
X
X uENTRY2("_htInitIter(0x%x,0x%x)\n",pTbl,pOutState);
X if ((pTbl!=NullHashTable)&&(pTbl->nStored>0)) {
X if (iState.index== -1) pState= &iState;
X else pState= uTypedAlloc(struct htIterState);
X if (pState!=NULL) {
X pState->index= 0;
X pState->pBkt= NULL;
X *pOutState= (Opaque)pState;
X uRETURN(True);
X }
X }
X *pOutState= (Opaque)NULL;
X uRETURN(False);
X}
X
X/***====================================================================***/
X
XBoolean
X_htIterNext(pTbl, pInState, pKey, pData)
XHashTablePtr pTbl;
XOpaque pInState;
XGenKey *pKey;
XGenData *pData;
X{
Xunsigned i;
Xstruct htIterState *pState= (struct htIterState *)pInState;
X
X uENTRY4("_htIterNext(0x%x,0x%x,0x%x,0x%x)\n",pTbl,pState,pKey,pData);
X if ((pTbl!=NullHashTable)&&(pInState!=(Opaque)NULL)) {
X if (pState->pBkt!=NULL) {
X pState->pBkt= pState->pBkt->next;
X }
X if (pState->pBkt==NULL) {
X for (i= pState->index;i<pTbl->nBuckets;i++) {
X if (pTbl->ppBuckets[i]!=NULL) {
X pState->pBkt= pTbl->ppBuckets[i];
X pState->index= i+1;
X break;
X }
X }
X }
X if (pState->pBkt!=NULL){
X *pKey= pState->pBkt->key;
X *pData= pState->pBkt->data;
X uRETURN(True);
X }
X }
X uRETURN(False);
X}
X
X/***====================================================================***/
X
Xvoid
XhtEndIterator(pTbl, state)
XHashTablePtr pTbl;
XOpaque state;
X{
Xstruct htIterState *pState= (struct htIterState *)state;
X
X uENTRY2("htEndIterator(0x%x,%d)\n",pTbl,state);
X if (state!=(Opaque)NULL) {
X pState->index= -1;
X if (pState!=&iState) {
X (void)uFree((Opaque)pState);
X }
X }
X uVOIDRETURN;
X}
END_OF_FILE
if test 13112 -ne `wc -c <'./utils/hash.c'`; then
echo shar: \"'./utils/hash.c'\" unpacked with wrong size!
fi
# end of './utils/hash.c'
fi
if test -f './xrooms/xrSetup.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./xrooms/xrSetup.c'\"
else
echo shar: Extracting \"'./xrooms/xrSetup.c'\" \(12133 characters\)
sed "s/^X//" >'./xrooms/xrSetup.c' <<'END_OF_FILE'
X
X /*\
X * $Header: xrSetup.c,v 5.2 90/01/11 15:18:32 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/Intrinsic.h>
X#include <X11/StringDefs.h>
X
X#define OPAQUE_DEFINED
X#define BOOLEAN_DEFINED
X#define DEBUG_VAR xrSetupDebug
X#include "utils.h"
X#include "strtbl.h"
X#include "rooms.h"
X#include "nameprof.h"
X#include "xrDebug.h"
X#include "xrApp.h"
X#include "xrProfile.h"
X#include "xrNames.h"
X#include "xrXUtils.h"
X#include "xrUI.h"
X#include "xrGen.h"
X#include "xrooms.h"
X
X/***====================================================================***/
X
Xstatic void
XxrUsage()
X{
X uInformation("no usage line yet\n");
X exit(0);
X}
X
X/***====================================================================***/
X
Xstatic XrmOptionDescRec commandOptions[] = {
X {"-allrooms", "allRooms", XrmoptionNoArg, "on" },
X {"-appstransient", "appsTransient",XrmoptionNoArg, "on" },
X {"-appspermanent", "appsTransient",XrmoptionNoArg, "off"},
X {"-autorooms", "allRooms", XrmoptionNoArg, "off"},
X {"-backup", "backupConfig", XrmoptionNoArg, "on" },
X {"-config", "config", XrmoptionSepArg, (caddr_t) NULL},
X {"-confirm", "confirmBox", XrmoptionNoArg, "on" },
X {"-debug", "debugFlags", XrmoptionSepArg, (caddr_t)NULL},
X {"-debugxrooms", "debugXrooms", XrmoptionSepArg, (caddr_t)0},
X {"-dfltroom", "defaultRoom", XrmoptionSepArg, (caddr_t) NULL},
X {"-dxwm", "useDxwm", XrmoptionNoArg, "on"},
X {"-fakeroot", "findFakeRoot", XrmoptionNoArg, "on"},
X {"-fakestate", "findFakeState",XrmoptionNoArg, "on"},
X {"-icccm", "nonICCCM", XrmoptionNoArg, "off"},
X {"-iconifyfirst", "iconifyFirst", XrmoptionNoArg,"on"},
X {"-iconifylast", "iconifyLast", XrmoptionNoArg,"off"},
X {"-ignoreappnames", "useAppNames", XrmoptionNoArg, "off"},
X {"-namelookup", "nameLookup", XrmoptionSepArg, (caddr_t)NULL},
X {"-setupmode", "allowSetupMode",XrmoptionNoArg, "on"},
X {"-noconfirm", "confirmBox", XrmoptionNoArg, "off" },
X {"-nogeometries", "useGeometries",XrmoptionNoArg, "off"},
X {"-nonicccm", "nonICCCM", XrmoptionNoArg, "on" },
X {"-noappnameatom", "appNameAtom", XrmoptionNoArg, (caddr_t)NULL},
X {"-nosetupmode", "allowSetupMode",XrmoptionNoArg, "off"},
X {"-notransients", "manageTransients",XrmoptionNoArg, "off" },
X {"-noversion", "printVersion", XrmoptionNoArg, "off" },
X {"-nowarnings", "printWarnings", XrmoptionNoArg, "off" },
X {"-nowithdrawn", "manageWithdrawn", XrmoptionNoArg, "off" },
X {"-realroot", "findFakeRoot", XrmoptionNoArg, "off" },
X {"-reopenforgeom", "reopenForGeom",XrmoptionNoArg, "on"},
X {"-appnameatom", "appNameAtom", XrmoptionSepArg, (caddr_t)NULL},
X {"-saverooms", "saveRooms", XrmoptionNoArg, "on" },
X {"-saveapps", "saveRooms", XrmoptionNoArg, "off" },
X {"-transients", "manageTransients", XrmoptionNoArg, "on" },
X {"-unmapforgeom", "unmapForGeom", XrmoptionNoArg, "on" },
X {"-unmapforstate", "unmapForState",XrmoptionNoArg, "on" },
X {"-useappnames", "useAppNames", XrmoptionNoArg, "on" },
X {"-useiconnames", "useWindowNames",XrmoptionNoArg, "off" },
X {"-usewinnames", "useWindowNames",XrmoptionNoArg, "on" },
X {"-version", "printVersion", XrmoptionNoArg, "on" },
X {"-warnings", "printWarnings", XrmoptionNoArg, "on" },
X {"-withdrawn", "manageWithdrawn", XrmoptionNoArg, "on" },
X#ifdef UI_ARGS
X UI_ARGS
X#endif
X};
X
X/***====================================================================***/
X
Xtypedef struct xrLegalArgValues {
X String debugSettings;
X Boolean printVersion;
X Boolean printWarnings;
X Boolean allowSetupMode;
X
X Boolean showAllRooms;
X String defaultRoom;
X Boolean confirmBox;
X
X Boolean iconifyFirst;
X
X Boolean dxwm;
X Boolean dfltAppsTransient;
X Boolean geometries;
X Boolean nonICCCM;
X Boolean reopenForGeom;
X Boolean unmapForGeom;
X Boolean unmapForState;
X Boolean manageTransients;
X Boolean manageWithdrawn;
X
X Boolean useAppNames;
X Boolean useWindowNames;
X char *appNameAtom;
X
X Boolean backupConfig;
X String configFile;
X Boolean saveRoomProfiles;
X
X String nameLookupFunc;
X
X Boolean findFakeRoot;
X Boolean findFakeState;
X#ifdef UI_FIELDS
X UI_FIELDS
X#endif
X} xrLegalArgValuesRec,*xrLegalArgValuesPtr;
X
X#define xrOffset(f) XtOffset(xrLegalArgValuesPtr,f)
X
X/***====================================================================***/
X
Xstatic XtResource resources[] = {
X {"allowSetupMode", "AllowSetupMode", XtRBoolean, sizeof(Boolean),
X xrOffset(allowSetupMode), XtRImmediate, (caddr_t)True},
X {"allRooms", "AllRooms", XtRBoolean, sizeof(Boolean),
X xrOffset(showAllRooms), XtRImmediate, (caddr_t)True},
X {"appNameAtom", "AppNameAtom", XtRString, sizeof(char *),
X xrOffset(appNameAtom), XtRString, (caddr_t) "_XROOMS_APP_NAME" },
X {"appsTransient", "AppsTransient", XtRBoolean, sizeof(Boolean),
X xrOffset(dfltAppsTransient), XtRImmediate, (caddr_t)True},
X {"backupConfig", "BackupConfigFile", XtRBoolean, sizeof(Boolean),
X xrOffset(backupConfig), XtRImmediate, (caddr_t)False},
X {"confirmBox", "ConfirmBox", XtRBoolean, sizeof(Boolean),
X xrOffset(confirmBox), XtRImmediate, (caddr_t) True},
X {"config", "ConfigFile", XtRString, sizeof (char *),
X xrOffset(configFile), XtRString, (caddr_t) NULL},
X {"debugFlags", "DebugFlags", XtRString, sizeof(char *),
X xrOffset(debugSettings), XtRString, (caddr_t) NULL},
X {"defaultRoom", "DefaultRoom", XtRString, sizeof(char *),
X xrOffset(defaultRoom), XtRString, (caddr_t) "Main"},
X {"findFakeRoot", "FindFakeRoot", XtRBoolean, sizeof(Boolean),
X xrOffset(findFakeRoot), XtRImmediate, (caddr_t) False},
X {"findFakeState", "FindFakeState", XtRBoolean, sizeof(Boolean),
X xrOffset(findFakeState), XtRImmediate, (caddr_t) False},
X {"iconifyFirst", "IconifyFirst", XtRBoolean, sizeof(Boolean),
X xrOffset(iconifyFirst), XtRImmediate, (caddr_t) True},
X {"manageTransients", "ManageTransients", XtRBoolean, sizeof(Boolean),
X xrOffset(manageTransients), XtRImmediate, (caddr_t) False},
X {"manageWithdrawn", "ManageWithdrawn", XtRBoolean, sizeof(Boolean),
X xrOffset(manageWithdrawn), XtRImmediate, (caddr_t) False},
X {"nameLookup", "NameLookup", XtRString, sizeof(char *),
X xrOffset(nameLookupFunc), XtRString, (caddr_t) "ChooseAppName" },
X {"nonICCCM", "NonICCCM", XtRBoolean, sizeof(Boolean),
X xrOffset(nonICCCM), XtRImmediate, (caddr_t)False},
X {"printVersion", "PrintVersion", XtRBoolean, sizeof(Boolean),
X xrOffset(printVersion), XtRImmediate, (caddr_t)False},
X {"printWarnings", "PrintWarnings", XtRBoolean, sizeof(Boolean),
X xrOffset(printWarnings), XtRImmediate, (caddr_t)False},
X {"reopenForGeom", "ReopenForGeom", XtRBoolean, sizeof(Boolean),
X xrOffset(reopenForGeom), XtRImmediate, (caddr_t) False},
X {"saveRooms", "SaveRooms", XtRBoolean, sizeof(Boolean),
X xrOffset(saveRoomProfiles), XtRImmediate,(caddr_t)True},
X {"unmapForGeom", "UnmapForGeom", XtRBoolean, sizeof(Boolean),
X xrOffset(unmapForGeom), XtRImmediate, (caddr_t) False},
X {"unmapForState", "UnmapForState", XtRBoolean, sizeof(Boolean),
X xrOffset(unmapForState), XtRImmediate, (caddr_t) False},
X {"useAppNames", "UseAppNames", XtRBoolean, sizeof(Boolean),
X xrOffset(useAppNames), XtRImmediate, (caddr_t) True},
X {"useDxwm", "UseDXWM", XtRBoolean, sizeof(Boolean),
X xrOffset(dxwm), XtRImmediate, (caddr_t) False},
X {"useGeometries", "UseGeometries", XtRBoolean, sizeof(Boolean),
X xrOffset(geometries), XtRImmediate, (caddr_t) True},
X {"useWindowNames", "UseWindowNames", XtRBoolean, sizeof(Boolean),
X xrOffset(useWindowNames), XtRImmediate, (caddr_t) False},
X#ifdef UI_RESOURCES
X UI_RESOURCES(xrLegalArgValuesPtr)
X#endif
X};
X
X/***====================================================================***/
X
XxrInitializePackages(pRes)
XxrLegalArgValuesPtr pRes;
X{
X uENTRY1("xrInitializePackages(0x%x)\n",pRes);
X
X stInit((unsigned)750,(unsigned)20,False,(Opaque)NULL);
X asSetScreenSize((unsigned)WidthOfScreen(xroomsScrn),
X (unsigned)HeightOfScreen(xroomsScrn));
X SetDefaultRoomFinder(xruiFindDefaultRoom);
X
X xraInit();
X xrnInit();
X
X if (pRes->debugSettings!=NullString)
X xrDebugSettings(pRes->debugSettings);
X
X roomIconifyFirst= pRes->iconifyFirst;
X xroomsSetupMode= pRes->allowSetupMode;
X if (pRes->showAllRooms)
X roomDefaultVisibility= roomAlways|roomVisible;
X else roomDefaultVisibility= roomWhenActive|roomWhenNonEmpty;
X xroomsPrintWarnings= pRes->printWarnings;
X
X if (pRes->printVersion) {
X uInformation("xrooms version %d.%02d.%02d [%s]\n",
X xroomsMajorVersion,xroomsMinorVersion,
X xroomsLocalVersion,xroomsCompileStamp);
X }
X
X xruiDefaultRoom= pRes->defaultRoom;
X xruiConfirmExit= pRes->confirmBox;
X
X xraDfltAppsTransient= pRes->dfltAppsTransient;
X xraUseGeometries= pRes->geometries;
X xraNonICCCM= pRes->nonICCCM;
X xraReopenForGeom= pRes->reopenForGeom;
X xraUnmapForGeom= pRes->unmapForGeom;
X xraUnmapForState= pRes->unmapForState;
X xraManageTransients= pRes->manageTransients;
X xraManageWithdrawn= pRes->manageWithdrawn;
X
X xrpfBackupConfig= pRes->backupConfig;
X xrpfConfigFile= pRes->configFile;
X xrpfSaveRoomProfiles= pRes->saveRoomProfiles;
X
X xrnUseAppNames= pRes->useAppNames;
X xrnUseWindowNames= pRes->useWindowNames;
X if ((pRes->appNameAtom!=NullString)&&(strlen(pRes->appNameAtom)>0))
X xrnAppNameAtom= XInternAtom(xroomsDpy,pRes->appNameAtom,False);
X else xrnAppNameAtom= None;
X
X if (pRes->nameLookupFunc!=NullString) {
X nprDefaultName= stGetToken(pRes->nameLookupFunc);
X xrnNameLookup= nprDefaultName;
X }
X
X xruFindFakeRoot= pRes->findFakeRoot;
X xruFindFakeState= pRes->findFakeState;
X
X if (pRes->dxwm) {
X xraNonICCCM= True;
X xruFindFakeRoot= True;
X xruFindFakeState= True;
X xraReopenForGeom= True;
X roomIconifyFirst= False;
X }
X
X UI_SETTINGS(pRes);
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xstatic xrLegalArgValuesRec xrResources;
X
XBoolean
XxrInitialize(argc, argv)
Xint argc;
Xchar **argv;
X{
XWidget topLevel;
X
X uENTRY2("xrInitialize(%d,0x%x)\n",argc,argv);
X if ((argc==2)&&(uStringEqual(argv[1],"-help"))) {
X xrUsage();
X /* NOTREACHED */
X }
X topLevel = XtInitialize("xrooms", "XRooms",
X commandOptions, XtNumber(commandOptions),
X &argc, argv);
X if (topLevel==(Widget)NULL) {
X uRETURN(False);
X }
X XtGetApplicationResources(topLevel,&xrResources,
X resources,XtNumber(resources),
X NULL, (Cardinal) 0);
X xroomsDpy= XtDisplay(topLevel);
X xroomsScrn= XtScreen(topLevel);
X
X WM_STATE= XInternAtom(xroomsDpy, "WM_STATE", False);
X WM_CHANGE_STATE= XInternAtom(xroomsDpy, "WM_CHANGE_STATE", False);
X WM_MOVED= XInternAtom(xroomsDpy, "WM_MOVED", False);
X XSetErrorHandler(xruIgnoreErrors);
X
X xrInitializePackages(&xrResources);
X
X xroomsRealRoot= RootWindowOfScreen(xroomsScrn);
X xroomsRoot= xruFindRoot();
X
X xrgenInit(xroomsDpy);
X xruiInit(topLevel);
X uRETURN(True);
X}
X
END_OF_FILE
if test 12133 -ne `wc -c <'./xrooms/xrSetup.c'`; then
echo shar: \"'./xrooms/xrSetup.c'\" unpacked with wrong size!
fi
# end of './xrooms/xrSetup.c'
fi
if test -f './xrset/xrReq.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./xrset/xrReq.c'\"
else
echo shar: Extracting \"'./xrset/xrReq.c'\" \(12331 characters\)
sed "s/^X//" >'./xrset/xrReq.c' <<'END_OF_FILE'
X
X /*\
X * $Header: xrReq.c,v 5.0 90/01/10 07:02:47 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 xrreqDebug
X#include "utils.h"
X#include "strtbl.h"
X#include <X11/Xproto.h>
X#include <X11/Xatom.h>
X#undef True
X#undef False
X#include "xrReq.h"
X
X
Xint xrreqTimeout= 5;
X
X/***====================================================================***/
X
XStringToken
XxrreqGetCurrent(dpy, root)
XDisplay *dpy;
XWindow root;
X{
XStringToken token;
Xchar *str;
XAtom actualType,*pRtrn;
Xint actualFormat,nItems,bytesAfter;
X
X uENTRY2("xrreqGetCurrent(0x%x,0x%x)\n",dpy,root);
X if (XGetWindowProperty(dpy,root,ROOMS_CURRENT,0,1,False,XA_ATOM,
X &actualType,&actualFormat,&nItems,&bytesAfter,
X (char *)&pRtrn)==Success) {
X if ((actualType==XA_ATOM)&&(nItems==1)) {
X str= XGetAtomName(dpy,*pRtrn);
X XFree(pRtrn);
X token= stGetToken(str);
X XFree(str);
X uRETURN(token);
X }
X }
X uRETURN(NullStringToken);
X}
X
X/***====================================================================***/
X
XBoolean
XxrreqGetAllRooms(dpy, root, pNRooms, pRooms)
XDisplay *dpy;
XWindow root;
Xint *pNRooms;
XStringToken *pRooms;
X{
X
X uENTRY4("xrreqGetAllRooms(0x%x,0x%x,0x%x,0x%x)\n",dpy,root,pNRooms,pRooms);
X uWarning("xrreqGetAllRooms not implemented yet\n");
X uRETURN(False);
X}
X
X/***==================================================================***/
X
X
Xstatic void
XnoPropertyChange()
X{
X uFatalError("Xrooms does not appear to be running (timeout)\n");
X}
X
Xchar *
XxrreqGetReply(dpy,root,win)
XDisplay *dpy;
XWindow root;
XWindow win;
X{
XXEvent event;
Xchar *str= NullString;
XBoolean done= False;
XAtom actualType,actualFormat,nItems,bytesAfter;
X
X uENTRY3("xrreqGetReply(0x%x,0x%x,0x%x)\n",dpy,root,win);
X#ifndef NO_TIMEOUTS
X if (xrreqTimeout>0)
X uSetTimeout(xrreqTimeout,0,noPropertyChange);
X#endif
X while (!done) {
X XWindowEvent(dpy,win,PropertyChangeMask,&event);
X if ((event.type==PropertyNotify)&&
X (event.xproperty.state==PropertyNewValue)&&
X (event.xproperty.atom==ROOMS_RETURN)) {
X#ifndef NO_TIMEOUTS
X if (xrreqTimeout>0)
X uClearTimeout();
X#endif
X XGetWindowProperty(dpy,win,ROOMS_RETURN,0,10000,True,XA_STRING,
X &actualType,&actualFormat,&nItems,&bytesAfter,&str);
X XDestroyWindow(dpy,win);
X done= True;
X }
X }
X uRETURN(str);
X}
X
X/***==================================================================***/
X
XWindow
XxrreqGetArgWindow(dpy,root)
XDisplay *dpy;
XWindow root;
X{
XWindow win;
XXSetWindowAttributes xswa;
X
X uENTRY2("xrreqGetArgWindow(0x%x,0x%x)\n",dpy,root);
X xswa.override_redirect= True;
X xswa.event_mask= PropertyChangeMask;
X win= XCreateWindow(dpy,root,0,0,1,1,0,CopyFromParent,InputOutput,
X CopyFromParent,CWOverrideRedirect|CWEventMask,&xswa);
X if (win==None) {
X uFatalError("Couldn't create argument window\n");
X /* NOTREACHED */
X }
X uRETURN(win);
X}
X
X/***====================================================================***/
X
Xchar *
XxrreqStringRequest(dpy,root,req,len,arg)
XDisplay *dpy;
XWindow root;
Xunsigned req;
Xint len;
Xchar *arg;
X{
XxrRequestRec xreq;
Xchar *argstr;
Xchar *reply;
X
X uENTRY5("xrreqStringRequest(0x%x,0x%x,0x%x,%d,%s)\n",dpy,root,req,len,arg);
X if (arg!=NullString) {
X xreq.request= req;
X xreq.size= (len+3)/4;
X xreq.win= xrreqGetArgWindow(dpy,root);
X argstr= (char *)uAlloc(xreq.size);
X if (argstr!=NullString) {
X bcopy(arg,argstr,len);
X XGrabServer(dpy);
X if (XChangeProperty(dpy,root,ROOMS_REQUEST,XA_INTEGER,32,
X PropModeAppend,&xreq,3)==Success) {
X XChangeProperty(dpy,xreq.win,ROOMS_ARGUMENT,XA_STRING,8,
X PropModeAppend,argstr,xreq.size*4);
X }
X XUngrabServer(dpy);
X XFlush(dpy);
X uFree(argstr);
X }
X reply= xrreqGetReply(dpy,root,xreq.win);
X uRETURN(reply);
X }
X uRETURN(NullString);
X}
X
X/***==================================================================***/
X
XBoolean
XxrreqIssueSetState(dpy,root,pArgs)
XDisplay *dpy;
XWindow root;
XxrSetStateArgsPtr pArgs;
X{
XBoolean ok;
Xint len;
Xchar buf[1024],*rtrn;
X
X uENTRY3("xrreqIssueSetState(0x%x,0x%x,0x%x)\n",dpy,root,pArgs);
X if (pArgs->whichPart==0) {
X if (pArgs->whichApp==XR_QUERY_APP)
X pArgs->whichPart= XR_QUERY_PARTS;
X else if (pArgs->toWhat=='P')
X pArgs->whichPart= XR_WINSTATE_PART|XR_POSITION_PART;
X else pArgs->whichPart= XR_GEOM_PARTS;
X }
X
X buf[0]= pArgs->doWhat;
X buf[1]= pArgs->toWhat;
X
X if (pArgs->whichPart&XR_WINSTATE_PART) buf[2]= '+';
X else buf[2]= '!';
X if (pArgs->whichPart&XR_X_PART) {
X if (pArgs->whichPart&XR_X_NEGATIVE) buf[3]= '-';
X else buf[3]= '+';
X }
X else if (pArgs->whichPart&XR_QUERY_PARTS) buf[3]= '?';
X else buf[3]= '!';
X
X if (pArgs->whichPart&XR_Y_PART) {
X if (pArgs->whichPart&XR_Y_NEGATIVE) buf[4]= '-';
X else buf[4]= '+';
X }
X else if (pArgs->whichPart&XR_QUERY_PARTS) buf[4]= '?';
X else buf[4]= '!';
X
X if (pArgs->whichPart&XR_WIDTH_PART) buf[5]= '+';
X else if (pArgs->whichPart&XR_QUERY_PARTS) buf[5]= '?';
X else buf[5]= '!';
X
X if (pArgs->whichPart&XR_HEIGHT_PART) buf[6]= '+';
X else if (pArgs->whichPart&XR_QUERY_PARTS) buf[6]= '?';
X else buf[6]= '!';
X
X switch (pArgs->whichState) {
X case XR_QUERY_STATE: buf[7]= '?'; break;
X case XR_LOCAL_STATE: buf[7]= 'L'; break;
X case XR_DFLT_STATE: buf[7]= 'D'; break;
X case XR_ALL_STATES: buf[7]= 'A'; break;
X case XR_VISIBLE_STATE:
X default: buf[7]= 'V'; break;
X }
X
X if ((pArgs->whichApp==XR_NAMED_APP)&&(pArgs->appName==NullString))
X pArgs->whichApp= XR_QUERY_APP;
X len= 9;
X switch (pArgs->whichApp) {
X case XR_LAST_APP: buf[8]= 'L'; break;
X case XR_ALL_APPS: buf[8]= 'A'; break;
X case XR_ACTIVE_APPS: buf[8]= 'V'; break;
X case XR_NAMED_APP: buf[8]= 'N';
X strcpy(&buf[9],pArgs->appName);
X len+= strlen(pArgs->appName)+1;
X break;
X case XR_QUERY_APP:
X default:
X xrreqTimeout= 30; /* XXX Hack */
X buf[8]= '?'; break;
X }
X
X if ((pArgs->whichRoom==XR_NAMED_ROOM)&&(pArgs->roomName==NullString))
X pArgs->whichRoom= XR_QUERY_ROOM;
X switch (pArgs->whichRoom) {
X case XR_QUERY_ROOM: buf[len++]= '?'; break;
X case XR_LAST_ROOM: buf[len++]= 'L'; break;
X case XR_ALL_ROOMS: buf[len++]= 'A'; break;
X case XR_VISIBLE_ROOMS: buf[len++]= 'V'; break;
X case XR_NAMED_ROOM: buf[len++]= 'N';
X strcpy(&buf[len],pArgs->roomName);
X len+= strlen(pArgs->roomName)+1;
X break;
X default:
X case XR_CURRENT_ROOM: buf[len++]= 'C'; break;
X }
X rtrn= xrreqStringRequest(dpy,root,XR_RQ_SET_STATE,len,buf);
X ok= ((rtrn!=NullString)&&(rtrn[0]=='t'));
X uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
XxrreqIssueRemember(dpy,root,pArgs)
XDisplay *dpy;
XWindow root;
XxrRememberArgsPtr pArgs;
X{
XBoolean ok;
Xchar buf[264],*rtrn;
X
X uENTRY3("xrreqIssueRemember(0x%x,0x%x,0x%x)\n",dpy,root,pArgs);
X if (pArgs->remember) buf[0]= 'R';
X else buf[0]= 'F';
X
X switch (pArgs->whichApp) {
X case XR_LAST_APP: buf[1]= 'L'; buf[2]= NUL; break;
X case XR_ALL_APPS: buf[1]= 'A'; buf[2]= NUL; break;
X case XR_ACTIVE_APPS: buf[1]= 'V'; buf[2]= NUL; break;
X case XR_NAMED_APP: buf[1]= 'N';
X strcpy(&buf[2],pArgs->appName);
X break;
X case XR_QUERY_APP:
X default: buf[1]= '?'; buf[2]= NUL; break;
X }
X rtrn= xrreqStringRequest(dpy,root,XR_RQ_REMEMBER,strlen(buf),buf);
X ok= ((rtrn!=NullString)&&(rtrn[0]=='t'));
X uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
XxrreqIssueVisibility(dpy,root,pArgs)
XDisplay *dpy;
XWindow root;
XxrVisibilityArgsPtr pArgs;
X{
XBoolean ok;
Xchar buf[264],*rtrn;
X
X uENTRY3("xrreqIssueVisibility(0x%x,0x%x,0x%x)\n",dpy,root,pArgs);
X if (pArgs->visibility&XR_ROOM_ALWAYS) buf[0]= 'A';
X else buf[0]= 'a';
X if (pArgs->visibility&XR_ROOM_WHEN_NON_EMPTY) buf[1]= 'N';
X else buf[1]= 'n';
X if (pArgs->visibility&XR_ROOM_WHEN_ACTIVE) buf[2]= 'A';
X else buf[2]= 'a';
X if (pArgs->visibility&XR_ROOM_VISIBLE) buf[3]= 'V';
X else buf[3]= 'H';
X if (pArgs->checkAuto) buf[4]= '+';
X else buf[4]= '-';
X if (pArgs->createRoom) buf[5]= 'C';
X else buf[5]= 'c';
X
X switch (pArgs->whichRoom) {
X case XR_LAST_ROOM: buf[6]= 'L'; buf[7]= NUL; break;
X case XR_ALL_ROOMS: buf[6]= 'A'; buf[7]= NUL; break;
X case XR_VISIBLE_ROOMS: buf[6]= 'V'; buf[7]= NUL; break;
X case XR_NAMED_ROOM: buf[6]= 'N';
X strcpy(&buf[7],pArgs->roomName);
X break;
X case XR_CURRENT_ROOM:
X case XR_QUERY_ROOM:
X default: buf[6]= 'C'; buf[7]= NUL; break;
X }
X rtrn= xrreqStringRequest(dpy,root,XR_RQ_SET_VISIBILITY,strlen(buf),buf);
X ok= ((rtrn!=NullString)&&(rtrn[0]=='t'));
X uRETURN(ok);
X}
X
X/***====================================================================***/
X
XBoolean
XxrreqIssueLoad(dpy,root,fileName)
XDisplay *dpy;
XWindow root;
Xchar *fileName;
X{
XBoolean ok;
Xchar *rtrn,*buf;
Xint szBuf,bufIndex,ch;
XFILE *file;
X
X uENTRY3("xrreqIssueLoad(0x%x,0x%x,%s)\n",dpy,root,uStringText(fileName));
X if (fileName!=NullString) {
X file= fopen(fileName,"r");
X if (file==NULL) {
X uWarning("Can't open \"%s\" to read\n",uStringText(fileName));
X uRETURN(False);
X }
X }
X else file= stdin;
X
X szBuf= 500;
X bufIndex= 0;
X buf= (char *)uAlloc(szBuf);
X while (((ch=getc(file))!=EOF)&&(buf!=NullString)) {
X if (bufIndex==szBuf) {
X szBuf*= 2;
X buf= (char *)uRealloc(buf,szBuf);
X }
X if (buf!=NullString) {
X buf[bufIndex++]= ch;
X }
X }
X if (buf!=NullString) {
X buf[bufIndex++]= NUL;
X if (bufIndex>1) {
X rtrn= xrreqStringRequest(dpy,root,XR_RQ_LOAD_PROFILE,bufIndex,buf);
X ok= ((rtrn!=NullString)&&(rtrn[0]=='t'));
X }
X else {
X uError("Profile is too short\n");
X ok= False;
X }
X uFree(buf);
X }
X else {
X uError("allocation failure in xrreqIssueLoad\n");
X }
X uRETURN(ok);
X}
X
X/***====================================================================***/
X
Xchar *
XxrreqIssueGetAppName(dpy,root,which,name)
XDisplay *dpy;
XWindow root;
Xunsigned which;
Xchar *name;
X{
XBoolean ok;
Xchar buf[264];
Xint len=1;
Xchar *str,*appName;
X
X uENTRY4("xrreqIssueGetAppName(0x%x,0x%x,0x%x,%s)\n",dpy,root,which,
X uStringText(name));
X if ((which==XR_NAMED_APP)&&(name==NullString))
X which= XR_QUERY_APP;
X switch (which) {
X case XR_LAST_APP: buf[0]= 'L'; break;
X case XR_ALL_APPS: buf[0]= 'A'; break;
X case XR_ACTIVE_APPS: buf[0]= 'V'; break;
X case XR_NAMED_APP: buf[0]= 'N';
X strcpy(&buf[1],name);
X len+= strlen(name)+1;
X break;
X case XR_QUERY_APP:
X default: buf[0]= '?'; break;
X }
X str= xrreqStringRequest(dpy,root,XR_RQ_APP_NAME,len,buf);
X if (str!=NullString) {
X if (str[0]=='t') {
X appName= uStringDup(&str[1]);
X }
X else appName= NullString;
X uFree(str);
X }
X else appName= NullString;
X uRETURN(appName);
X}
X
X/***====================================================================***/
X
XBoolean
XxrreqIssueDebug(dpy,root,str)
XDisplay *dpy;
XWindow root;
Xchar *str;
X{
XBoolean ok;
Xchar *rtrn;
X
X uENTRY3("xrreqIssueDebug(0x%x,0x%x,%s)\n",dpy,root,uStringText(str));
X rtrn= xrreqStringRequest(dpy,root,XR_RQ_DEBUG,strlen(str),str);
X ok= ((rtrn!=NullString)&&(rtrn[0]=='t'));
X uRETURN(ok);
X}
X
END_OF_FILE
if test 12331 -ne `wc -c <'./xrset/xrReq.c'`; then
echo shar: \"'./xrset/xrReq.c'\" unpacked with wrong size!
fi
# end of './xrset/xrReq.c'
fi
echo shar: End of archive 7 \(of 14\).
cp /dev/null ark7isdone
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