v05i060: Xrooms -- A Rooms implementation for X, Part10/14
Kent Landfield
kent at ssbell.IMD.Sterling.COM
Mon Jan 15 17:18:05 AEST 1990
Submitted-by: wsl.dec.com!mikey (Mike Yang)
Posting-number: Volume 5, Issue 60
Archive-name: xrooms/part10
#! /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 10 (of 14)."
# Contents: ./lib/room.c ./lib/room.h
# Wrapped by kent at ssbell on Sun Jan 14 21:58:09 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f './lib/room.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./lib/room.c'\"
else
echo shar: Extracting \"'./lib/room.c'\" \(19920 characters\)
sed "s/^X//" >'./lib/room.c' <<'END_OF_FILE'
X
X /*\
X * $Header: room.c,v 5.2 90/01/11 13:38: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#define DEBUG_VAR roomDebug
X#include "utils.h"
X#include "app.h"
X#include "roomstr.h"
X
Xunsigned roomDefaultAppSlots= ROOM_DEFAULT_APP_SLOTS;
Xunsigned roomDefaultVisibility= ROOM_DEFAULT_VISIBILITY;
XBoolean roomIconifyFirst= True;
X
X/***====================================================================***/
X/*** DEBUGGING FUNCTIONS ***/
X/***====================================================================***/
X
Xchar *
XroomText(pRoom)
XRoomPtr pRoom;
X{
X if ((pRoom==NullRoom)||(pRoom->name==NullStringToken))
X return("<NullRoom>");
X else return(stText(pRoom->name));
X}
X
X/***====================================================================***/
X
Xvoid
XroomDebugPrint(pRoom)
XRoomPtr pRoom;
X{
XOpaque lstate;
XGenKey key;
XGenData data;
XRoomAppInfoPtr pAppInfo;
X
X if (pRoom!=NullRoom) {
X uDebug("room %s (0x%x)\n",roomText(pRoom),pRoom);
X uDebugIndent(1);
X uDebug("name= %s\n",stText(pRoom->name));
X uDebug("active= %s\n",booleanText(pRoom->active));
X uDebug("visibility= 0x%x\n",pRoom->visibility);
X uDebug("numApps= %d\n",pRoom->numApps);
X uDebug("numLocalApps= %d\n",pRoom->numLocalApps);
X uDebug("priv= 0x%x\n",pRoom->priv);
X uDebug("feedback= 0x%x\n",pRoom->feedback);
X uDebug("contents:\n");
X uDebugIndent(1);
X lIterator(pRoom->contents,key,data,lstate) {
X pAppInfo= (RoomAppInfoPtr)data;
X uDebug("app %s (0x%x):\n",appText(pAppInfo->pApp),pAppInfo->pApp);
X uDebugIndent(1);
X uDebug("local= %s (0x%x)\n",asText(pAppInfo->pLocal),
X pAppInfo->pLocal);
X uDebug("default= %s (0x%x)\n",asText(pAppInfo->pDefault),
X pAppInfo->pDefault);
X uDebug("current= %s (0x%x)\n",asText(pAppInfo->pReal),
X pAppInfo->pReal);
X uDebugIndent(-1);
X }
X lEndIterator(pRoom->contents,lstate);
X uDebugIndent(-2);
X }
X return;
X}
X
X/***====================================================================***/
X
X /*\
X * Private debuggging function. returns a string for
X * a RoomAppInfo. Never returns NullString.
X \*/
X
Xstatic char *
XroomAppInfoText(pAppInfo)
XRoomAppInfoPtr pAppInfo;
X{
X if ((pAppInfo==NullRoomAppInfo)||(pAppInfo->pApp==NullApp))
X return("<NullRoomAppInfoInfo>");
X else return(appText(pAppInfo->pApp));
X}
X
X/***====================================================================***/
X/*** FUNCTIONS TO CREATE AND DESTROY A ROOM ***/
X/***====================================================================***/
X
XRoomPtr
XroomCreate(name,priv,feedback)
XStringToken name;
XOpaque priv;
XRoomFeedbackFunc feedback;
X{
XRoomPtr pRoom;
X
X uENTRY3("roomCreate(%s,0x%x,0x%x)\n",stText(name),priv,feedback);
X if (name==NullStringToken) {
X uRETURN(NullRoom);
X }
X pRoom= uTypedAlloc(RoomRec);
X if (pRoom!=NullRoom) {
X pRoom->name= name;
X pRoom->active= False;
X pRoom->visibility= roomDefaultVisibility;
X if (_Always(pRoom)) _SetVisible(pRoom);
X pRoom->contents= lCreate(roomDefaultAppSlots,NullListSortFunc,
X genIntegerKeyType,
X genFreedPointerDataType);
X if (pRoom->contents==NullList) {
X (void)roomDestroy(pRoom);
X uRETURN(NullRoom);
X }
X pRoom->numApps= 0;
X pRoom->numLocalApps= 0;
X pRoom->priv= (Opaque)priv;
X pRoom->feedback= (RoomFeedbackFunc)feedback;
X _Feedback(pRoom,roomFBCreated,NullApp);
X if (_IsVisible(pRoom))
X _Feedback(pRoom,roomFBVisible,NullApp);
X }
X uRETURN(pRoom);
X}
X
X/***====================================================================***/
X
Xvoid
XroomDestroy(pRoom)
XRoomPtr pRoom;
X{
X uENTRY1("roomDestroy(%s)\n",roomText(pRoom));
X if (pRoom!=NullRoom) {
X if (_IsVisible(pRoom)) {
X _SetHidden(pRoom);
X _Feedback(pRoom,roomFBHidden,NullApp);
X }
X _Feedback(pRoom,roomFBDestroyed,NullApp);
X if (pRoom->contents!=NullList)
X (void)lDestroy(pRoom->contents);
X pRoom->name= NullStringToken;
X pRoom->contents= NullList;
X pRoom->priv= (Opaque)NULL;
X pRoom->numApps= 0;
X pRoom->numLocalApps= 0;
X pRoom->feedback= (RoomFeedbackFunc)NULL;
X (void)uFree((Opaque)pRoom);
X }
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X/*** FUNCTIONS TO CHANGE OR QUERY THE SET OF MANAGED APPS IN A ROOM ***/
X/***====================================================================***/
X
XBoolean
XroomManageApp(pRoom,pApp)
XRoomPtr pRoom;
XAppPtr pApp;
X{
XRoomAppInfoPtr pAppInfo;
X
X uENTRY2("roomManageApp(%s,%s)\n",roomText(pRoom),appText(pApp));
X if ((pRoom==NullRoom)||(pApp==NullApp)) {
X uRETURN(False);
X }
X if (lLookup(pRoom->contents,(GenKey)appName(pApp),(GenData *)&pAppInfo)) {
X uRETURN(False); /* already managed by this room */
X }
X pAppInfo= uTypedAlloc(RoomAppInfoRec);
X if (pAppInfo==NullRoomAppInfo) {
X uRETURN(False);
X }
X pAppInfo->pApp= pApp;
X pAppInfo->pDefault= appGetDefault(pApp);
X pAppInfo->pReal= appGetCurrent(pApp);
X pAppInfo->pLocal= appGetRoomState(pApp,pRoom->name);
X if ((pAppInfo->pDefault==NullAppState)||
X (pAppInfo->pReal==NullAppState)) {
X uFree((Opaque)pAppInfo);
X uRETURN(False);
X }
X if (_HasLocalState(pRoom,pAppInfo)) {
X if (asFullySame(pAppInfo->pLocal,pAppInfo->pDefault)) {
X if (appRemoveRoomState(pApp,pRoom->name)) {
X pAppInfo->pLocal= NullAppState;
X }
X }
X }
X (void)lStore(pRoom->contents,(GenKey)appName(pApp),(GenData)pAppInfo);
X if (_HasLocalState(pRoom,pAppInfo)) {
X _LocalAppAdded(pRoom);
X }
X pRoom->numApps++;
X _CheckRealState(pRoom,pAppInfo);
X _Feedback(pRoom,roomFBAppAdded,pApp);
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XroomUnmanageApp(pRoom, pApp)
XRoomPtr pRoom;
XAppPtr pApp;
X{
XRoomAppInfoPtr pAppInfo;
X
X uENTRY2("roomUnmanageApp(%s, %s)\n",roomText(pRoom),appText(pApp));
X if ((pRoom==NullRoom)||(pApp==NullApp)) {
X uRETURN(False);
X }
X (void)lLookup(pRoom->contents,(GenKey)appName(pApp),(GenData *)&pAppInfo);
X if (pAppInfo!=NullRoomAppInfo) {
X _Feedback(pRoom,roomFBAppRemoved,pApp);
X if (_HasLocalState(pRoom,pAppInfo)) {
X _LocalAppGone(pRoom);
X }
X pRoom->numApps--;
X (void)lRemove(pRoom->contents,(GenKey)appName(pApp));
X uRETURN(True);
X }
X uRETURN(False);
X}
X
X/***====================================================================***/
X
XAppPtr
XroomLookupManagedApp(pRoom, appName)
XRoomPtr pRoom;
XStringToken appName;
X{
XRoomAppInfoPtr pAppInfo;
X
X uENTRY2("roomLookupManagedApp(%s,%s)\n",roomText(pRoom),stText(appName));
X if ((pRoom==NullRoom)||(appName==NullStringToken)) {
X uRETURN(NullApp);
X }
X if (lLookup(pRoom->contents,(GenKey)appName,(GenData *)&pAppInfo)) {
X uRETURN(pAppInfo->pApp);
X }
X else {
X uRETURN(NullApp);
X }
X}
X
X/***====================================================================***/
X/*** FUNCTIONS TO CHANGE, CHECK, OR QUERY THE STATE OF AN APP IN A ROOM ***/
X/***====================================================================***/
X
XBoolean
XroomAppRealStateChanged(pRoom, pApp, pReal)
XRoomPtr pRoom;
XAppPtr pApp;
XAppStatePtr pReal;
X{
XRoomAppInfoPtr pAppInfo;
XAppStatePtr pVisible;
X
X uENTRY3("roomAppRealStateChanged(%s,%s,%s)\n",roomText(pRoom),appText(pApp),
X asText(pReal));
X if ((pRoom==NullRoom)||(pApp==NullApp)||(!asLegalReal(pReal))) {
X uRETURN(False);
X }
X if (!lLookup(pRoom->contents,(GenKey)appName(pApp),(GenData *)&pAppInfo)) {
X uRETURN(False);
X }
X uASSERT("roomAppRealStateChanged", pApp==pAppInfo->pApp );
X
X pVisible= _GetVisibleState(pRoom,pAppInfo);
X if (!asProfileCorrectWRTReal(pVisible,pReal)) {
X if (!_HasLocalState(pRoom,pAppInfo)) {
X pAppInfo->pLocal= appSetRoomState(pApp,pRoom->name,
X pAppInfo->pDefault,
X False);
X if (pAppInfo->pLocal==NullAppState) {
X uRETURN(False);
X }
X asCopyFully(pReal,pAppInfo->pLocal);
X _LocalAppAdded(pRoom);
X }
X else {
X pAppInfo->pLocal= appSetRoomState(pApp,pRoom->name,pReal,True);
X }
X }
X _CheckRealState(pRoom,pAppInfo);
X if (_HasLocalState(pRoom,pAppInfo)) {
X if (asFullySame(pAppInfo->pLocal,pAppInfo->pDefault)) {
X if (appRemoveRoomState(pApp,pRoom->name)) {
X pAppInfo->pLocal= NullAppState;
X _LocalAppGone(pRoom);
X }
X else {
X uWarning("room %s and app %s disagree about local state\n",
X roomText(pRoom),appText(pApp));
X }
X }
X }
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XroomChangeAppLocalState(pRoom, pApp, pProf)
XRoomPtr pRoom;
XAppPtr pApp;
XAppStatePtr pProf;
X{
XRoomAppInfoPtr pAppInfo;
X
X uENTRY3("roomChangeAppLocalState(%s,%s,%s)\n",roomText(pRoom),appText(pApp),
X asText(pProf));
X if ((pRoom==NullRoom)||(pApp==NullApp)||(!asLegalProfile(pProf))) {
X uRETURN(False);
X }
X if (!lLookup(pRoom->contents,(GenKey)appName(pApp),(GenData *)&pAppInfo)) {
X uRETURN(False);
X }
X uASSERT("roomChangeAppLocalState", pApp==pAppInfo->pApp );
X
X if (!_HasLocalState(pRoom,pAppInfo)) {
X pAppInfo->pLocal= appSetRoomState(pApp,pRoom->name,pProf,False);
X if (!_HasLocalState(pRoom,pAppInfo)) {
X uRETURN(False);
X }
X _LocalAppAdded(pRoom);
X }
X else {
X pAppInfo->pLocal= appSetRoomState(pApp,pRoom->name,pProf,False);
X }
X _CheckRealState(pRoom,pAppInfo);
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XroomCheckAppStates(pRoom,pApp)
XRoomPtr pRoom;
XAppPtr pApp;
X{
XRoomAppInfoPtr pAppInfo;
XBoolean hadLocal,hasLocal;
X
X uENTRY2("roomCheckAppStates(%s,%s)\n",roomText(pRoom),appText(pApp));
X if ((pRoom==NullRoom)||(pApp==NullApp)) {
X uRETURN(False);
X }
X if (lLookup(pRoom->contents,(GenKey)appName(pApp),(GenData *)&pAppInfo)) {
X hadLocal= _HasLocalState(pRoom,pAppInfo);
X pAppInfo->pLocal= appGetRoomState(pApp,pRoom->name);
X pAppInfo->pDefault= appGetDefault(pApp);
X pAppInfo->pReal= appGetCurrent(pApp);
X if (_HasLocalState(pRoom,pAppInfo)) {
X if (asFullySame(pAppInfo->pLocal,pAppInfo->pDefault)) {
X if (appRemoveRoomState(pApp,pRoom->name)) {
X pAppInfo->pLocal= NullAppState;
X }
X }
X }
X hasLocal= _HasLocalState(pRoom,pAppInfo);
X if (hadLocal!=hasLocal) {
X if (hadLocal) { _LocalAppGone(pRoom); }
X else { _LocalAppAdded(pRoom); }
X }
X _CheckRealState(pRoom,pAppInfo);
X uRETURN(True);
X }
X uRETURN(False);
X}
X
X/***====================================================================***/
X
XAppStatePtr
XroomGetVisibleState(pRoom, pApp)
XRoomPtr pRoom;
XAppPtr pApp;
X{
XRoomAppInfoPtr pAppInfo;
XAppStatePtr pVisible;
X
X uENTRY2("roomGetVisibleState(%s,%s)\n",roomText(pRoom),appText(pApp));
X if ((pRoom==NullRoom)||(pApp==NullApp)) {
X uRETURN(NullAppState);
X }
X if (lLookup(pRoom->contents,(GenKey)appName(pApp),(GenData *)&pAppInfo)) {
X pVisible= _GetVisibleState(pRoom,pAppInfo);
X uRETURN(pVisible);
X }
X uRETURN(NullAppState);
X}
X
X/***====================================================================***/
X/*** FUNCTIONS TO CHANGE/QUERY ROOM VISIBILITY ***/
X/***====================================================================***/
X
XBoolean
XroomIsVisible(pRoom)
XRoomPtr pRoom;
X{
X uENTRY1("roomIsVisible(%s)\n",roomText(pRoom));
X uRETURN(_IsVisible(pRoom));
X}
X
X/***====================================================================***/
X
XBoolean
XroomSetVisibility(pRoom,visibility,check)
XRoomPtr pRoom;
Xunsigned visibility;
XBoolean check;
X{
XBoolean wasVisible;
X
X uENTRY3("roomSetVisibility(%s,0x%x,%s)\n",roomText(pRoom),visibility,
X booleanText(check));
X if (pRoom!=NullRoom) {
X wasVisible= _IsVisible(pRoom);
X pRoom->visibility= visibility;
X if (check&&(_Always(pRoom)||_WhenNonEmpty(pRoom)||_WhenActive(pRoom))) {
X if (_Always(pRoom)) _SetVisible(pRoom);
X else {
X _SetHidden(pRoom);
X if (_WhenNonEmpty(pRoom)&&_HasLocalApps(pRoom)) {
X _SetVisible(pRoom);
X }
X else if (_WhenActive(pRoom)&&_IsActive(pRoom)) {
X _SetVisible(pRoom);
X }
X }
X }
X if (_IsVisible(pRoom)!=wasVisible) {
X _Feedback(pRoom,(wasVisible?roomFBHidden:roomFBVisible),NullApp);
X }
X }
X uRETURN(False);
X}
X
X/***====================================================================***/
X
XBoolean
XroomCheckVisibility(pRoom)
XRoomPtr pRoom;
X{
XBoolean shouldBeVisible;
X
X uENTRY1("roomCheckVisibility(%s)\n",pRoom);
X if (pRoom!=NullRoom) {
X if (_Always(pRoom)||_WhenActive(pRoom)||_WhenNonEmpty(pRoom)) {
X if (_Always(pRoom)) shouldBeVisible= True;
X else {
X shouldBeVisible= ((_WhenActive(pRoom)&&_IsActive(pRoom))||
X (_WhenNonEmpty(pRoom)&&_HasLocalApps(pRoom)));
X }
X if (shouldBeVisible&&_IsHidden(pRoom)) {
X _SetVisible(pRoom);
X _Feedback(pRoom,roomFBVisible,NullApp);
X }
X else if ((!shouldBeVisible)&&_IsVisible(pRoom)) {
X _SetHidden(pRoom);
X _Feedback(pRoom,roomFBHidden,NullApp);
X }
X }
X uRETURN(True);
X }
X uRETURN(False);
X}
X
X/***====================================================================***/
X
Xunsigned
XroomGetVisibility(pRoom)
XRoomPtr pRoom;
X{
X uFLAG_ENTRY1(LOW_ENTRY_BIT,"roomGetVisibility(%s)\n",roomText(pRoom));
X if (pRoom!=NullRoom) {
X uFLAG_RETURN(pRoom->visibility);
X }
X uFLAG_RETURN(roomHidden);
X}
X
X/***====================================================================***/
X/*** FUNCTIONS TO ACTIVATE OR DEACTIVATE A ROOM ***/
X/***====================================================================***/
X
XBoolean
XroomActivate(pRoom)
XRoomPtr pRoom;
X{
XOpaque lstate;
XGenKey key;
XGenData data;
XRoomAppInfoPtr pAppInfo;
XAppStatePtr pState;
XWinState firstPassState;
X
X uENTRY1("roomActivate(%s)\n",roomText(pRoom));
X if (pRoom==NullRoom) {
X uRETURN(False);
X }
X if (!_IsActive(pRoom)) {
X pRoom->active= True;
X if (_WhenActive(pRoom)&&(!_IsVisible(pRoom))) {
X _SetVisible(pRoom);
X _Feedback(pRoom,roomFBVisible,NullApp);
X }
X _Feedback(pRoom,roomFBActivated,NullApp);
X
X if (roomIconifyFirst) firstPassState= asIconic;
X else firstPassState= asNormal;
X
X lIterator(pRoom->contents,key,data,lstate) {
X pAppInfo= (RoomAppInfoPtr)data;
X pState= _GetVisibleState(pRoom,pAppInfo);
X if (asWinState(pState)==firstPassState) {
X _CheckRealState(pRoom,pAppInfo);
X }
X }
X lEndIterator(pRoom->contents,lstate);
X lIterator(pRoom->contents,key,data,lstate) {
X pAppInfo= (RoomAppInfoPtr)data;
X pState= _GetVisibleState(pRoom,pAppInfo);
X if (asWinState(pState)!=firstPassState) {
X _CheckRealState(pRoom,pAppInfo);
X }
X }
X lEndIterator(pRoom->contents,lstate);
X }
X uRETURN(True);
X}
X
X/***====================================================================***/
X
XBoolean
XroomDeactivate(pRoom)
XRoomPtr pRoom;
X{
X uENTRY1("roomDeactivate(%s)\n",roomText(pRoom));
X if (pRoom!=NullRoom) {
X if (_IsActive(pRoom)) {
X pRoom->active= False;
X _Feedback(pRoom,roomFBDeactivated,NullApp);
X if ((!_Always(pRoom))&&_WhenActive(pRoom)&&_IsVisible(pRoom)) {
X if ((!_WhenNonEmpty(pRoom))||_NoLocalApps(pRoom)) {
X _SetHidden(pRoom);
X _Feedback(pRoom,roomFBHidden,NullApp);
X }
X }
X }
X uRETURN(True);
X }
X uRETURN(False);
X}
X
X/***====================================================================***/
X/*** MISCELLANEOUS ACCESS FUNCTIONS ***/
X/***====================================================================***/
X
XStringToken
XroomName(pRoom)
XRoomPtr pRoom;
X{
X uFLAG_ENTRY1(LOW_ENTRY_BIT,"roomName(%s)\n",roomText(pRoom));
X if (pRoom==NullRoom) {
X uFLAG_RETURN(NullStringToken);
X }
X uFLAG_RETURN(pRoom->name);
X}
X
X/***====================================================================***/
X
Xunsigned
XroomNumApps(pRoom)
XRoomPtr pRoom;
X{
X uFLAG_ENTRY1(LOW_ENTRY_BIT,"roomNumApps(%s)\n",roomText(pRoom));
X uFLAG_RETURN(pRoom->numApps);
X}
X
X/***====================================================================***/
X
Xunsigned
XroomNumLocalApps(pRoom)
XRoomPtr pRoom;
X{
X uFLAG_ENTRY1(LOW_ENTRY_BIT,"roomNumLocalApps(%s)\n",roomText(pRoom));
X uFLAG_RETURN(pRoom->numLocalApps);
X}
X
X/***====================================================================***/
X
Xvoid
XroomSetFeedback(pRoom,func)
XRoomPtr pRoom;
XRoomFeedbackFunc func;
X{
X uFLAG_ENTRY2(LOW_ENTRY_BIT,"roomSetFeedback(%s,0x%x)\n",roomText(pRoom),
X func);
X if (pRoom!=NullRoom) {
X pRoom->feedback= func;
X }
X uFLAG_VOIDRETURN;
X}
X
X/***====================================================================***/
X
XRoomFeedbackFunc
XroomGetFeedback(pRoom)
XRoomPtr pRoom;
X{
X uFLAG_ENTRY1(LOW_ENTRY_BIT,"roomSetFeedback(%s)\n",roomText(pRoom));
X if (pRoom!=NullRoom) {
X uFLAG_RETURN(pRoom->feedback);
X }
X uFLAG_RETURN((RoomFeedbackFunc)NULL);
X}
X
X/***====================================================================***/
X
Xvoid
XroomSetPrivate(pRoom,priv)
XRoomPtr pRoom;
XOpaque priv;
X{
X
X uFLAG_ENTRY2(LOW_ENTRY_BIT,"roomSetPrivate(%s,0x%x)\n",roomText(pRoom),
X priv);
X if (pRoom!=NullRoom) {
X pRoom->priv= priv;
X }
X uFLAG_VOIDRETURN;
X}
X
X/***====================================================================***/
X
XOpaque
XroomGetPrivate(pRoom)
XRoomPtr pRoom;
X{
X uFLAG_ENTRY1(LOW_ENTRY_BIT,"roomGetPriv(%s)\n",roomText(pRoom));
X if (pRoom!=NullRoom) {
X uFLAG_RETURN(pRoom->priv);
X }
X uFLAG_RETURN((Opaque)NULL);
X}
X
X/***====================================================================***/
X
Xstruct roomIterArg {
X Boolean localOnly;
X RoomPtr pRoom;
X RoomIterFunc pFunc;
X Opaque arg;
X};
X
Xstatic Boolean
X_roomIterator(keyIn,dataIn,argIn)
XGenKey keyIn;
XGenData dataIn;
XOpaque argIn;
X{
XStringToken key= (StringToken)keyIn;
XRoomAppInfoPtr pAppInfo= (RoomAppInfoPtr)dataIn;
Xstruct roomIterArg *pArg= (struct roomIterArg *)argIn;
X
X uENTRY3("_roomIterator(%s,%s,0x%x)\n",stText(key),
X roomAppInfoText(pAppInfo),pArg);
X if ((!pArg->localOnly)||(_HasLocalState(pArg->pRoom,pAppInfo))) {
X uRETURN((*pArg->pFunc)(pAppInfo->pApp,pAppInfo->pLocal,
X pAppInfo->pDefault,
X pAppInfo->pReal,pArg->arg));
X }
X uRETURN(True);
X}
X
Xvoid
XroomIterateApps(pRoom,pFunc,arg)
XRoomPtr pRoom;
XRoomIterFunc pFunc;
XOpaque arg;
X{
Xstruct roomIterArg iArg;
X
X uENTRY3("roomIterateApps(%s,0x%x,0x%x)\n",roomText(pRoom),pFunc,arg);
X if ((pRoom!=NullRoom)&&(pFunc!=NULL)) {
X iArg.localOnly= False;
X iArg.pRoom= pRoom;
X iArg.pFunc= pFunc;
X iArg.arg= arg;
X (void)lIterate(pRoom->contents,_roomIterator,(Opaque)&iArg);
X }
X uVOIDRETURN;
X}
X
Xvoid
XroomIterateLocalApps(pRoom,pFunc,arg)
XRoomPtr pRoom;
XRoomIterFunc pFunc;
XOpaque arg;
X{
Xstruct roomIterArg iArg;
X
X uENTRY3("roomIterateApps(%s,0x%x,0x%x)\n",roomText(pRoom),pFunc,arg);
X if ((pRoom!=NullRoom)&&(pFunc!=NULL)) {
X iArg.localOnly= True;
X iArg.pRoom= pRoom;
X iArg.pFunc= pFunc;
X iArg.arg= arg;
X (void)lIterate(pRoom->contents,_roomIterator,(Opaque)&iArg);
X }
X uVOIDRETURN;
X}
END_OF_FILE
if test 19920 -ne `wc -c <'./lib/room.c'`; then
echo shar: \"'./lib/room.c'\" unpacked with wrong size!
fi
# end of './lib/room.c'
fi
if test -f './lib/room.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./lib/room.h'\"
else
echo shar: Extracting \"'./lib/room.h'\" \(17316 characters\)
sed "s/^X//" >'./lib/room.h' <<'END_OF_FILE'
X#ifndef ROOM_H
X#define ROOM_H 1
X
X /*\
X * $Header: room.h,v 5.1 90/01/11 13:39:18 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 * Methods for manipulating a Room. A Room represents a single
X * room, presumably in a rooms application. This package deals
X * with rooms in isolation; it does not deal with interactions
X * or between multiple rooms.
X *
X * A room has a set of Apps whose geometry it manages. An App is
X * local to a Room if the App has a room state specific to that
X * Room. A Room may manage Apps that are not local to the Room,
X * in which case the Room should use the App default state. The
X * "visible" state of an App in a Room is the state that the Room
X * tries to maintain for that App (i.e. the local state of the App
X * if the App is local to the Room, the default state of the App if
X * the App is managed but not local, and NullAppState if the App is
X * not managed by the room).
X *
X * An active room tries to change the current state of the Apps it
X * manages whenever that current state is out of sync with the
X * visible state of the App in the Room. An inactive Room allow
X * the App's current state to diverge from the Room's visible
X * state for that App.
X *
X * App's may be managed by multiple rooms, but no more than one
X * of the managing rooms should be active at any time or chaos
X * may result.
X *
X * A Room may exist without being visible to the user (of xrooms);
X * such a Room is "hidden." Any Room that is visible to the user
X * is said to be "visible." Note that it is quite confusing to the
X * user for an active Room to be hidden. Room visibility may be
X * controlled explicitly or automatically.
X * The explicit visibility controls are:
X * roomVisible -- Room is visible.
X * roomHidden -- Room is hidden.
X * The automatic visibility controls that this package provides are:
X * roomAlways -- Room is always visible.
X * roomWhenActive -- Room is visible whenever it is active.
X * roomWhenNonEmpty -- Room is visible whenever it has at least
X * one *local* App.
X * Any combination of automatic controls can be specified.
X *
X * This package was written to support an implementation of rooms
X * under X, but it doesn't know anything about X. I relies on
X * the App package to shove applications around and calls a
X * Feedback function supplied by xrooms whenever the state of the
X * room changes. This function should provide any feedback xrooms
X * wants to give the user (highlighting the button of the active room
X * or adding the button of a newly visible room, for example).
X * The types of feedback reported to xrooms are:
X * roomCreated, roomDestroyed, roomActivated, roomDeactivated,
X * roomHidden, roomVisible, roomAppAdded, roomAppRemoved
X *
X * PUBLIC PACKAGE GLOBAL VARIABLE --
X * unsigned roomDebug;
X * Set of debugging flags. The only flags currently defined
X * is ENTER (0x10) defined in ../utils/utils.h. Intial value
X * is 0.
X * unsigned roomDefaultAppSlots;
X * The number of slots allocated for Apps in a Room by default.
X * App slots are increased dynamically, so this value isn't
X * too critical. It should be a reasonable guesstimate of the
X * maximum number of Apps *active* at any one time to help
X * minimize allocator overhead and fragmentation. Initial
X * value is 17.
X * unsigned roomDefaultVisibility;
X * Default visibility of newly created Rooms. Initial value
X * is (roomWhenActive|roomWhenNonEmpty).
X * Boolean roomIconifyFirst;
X * If True, iconify all applications that need to be iconified
X * before moving or opening other applications. If False,
X * order is undefined. Default is True.
X *
X * DEBUGGGING FUNCTIONS --
X * char *
X * roomText(pRoom)
X * RoomPtr pRoom;
X * Returns the name of "pRoom" in a static buffer which may be
X * clobbered by subsequent calls to roomText. Guaranteed not
X * to return NullString.
X *
X * void
X * roomDebugPrint(pRoom)
X * Prints scads of useful debugging information about "pRoom"
X * using uDebug (which usually writes to stderr).
X *
X * FUNCTIONS TO CREATE AND DESTROY ROOMS --
X * RoomPtr
X * roomCreate(name,private,feedback)
X * StringToken name;
X * Opaque private;
X * RoomFeedbackFunc feedback.
X * Creates a room with the specified name, private field and
X * feedback function. The new Room manages no applications
X * and has default visibility.
X *
X * Calls "feedback" (if non-NULL) to note "roomCreated."
X *
X * Returns a pointer to the newly created Room or NullRoom
X * if name is NullStringToken or there is an allocation failure.
X *
X * void
X * roomDestroy(pRoom)
X * RoomPtr pRoom;
X * Destroys "pRoom" and frees any memory it uses. roomDestroy
X * first deactivates the the Room if active, then hides the
X * room if visible, and then finally destroys the room and
X * frees any memory it uses. The feedback function is called
X * separately for the deactivation, the hide and the destroy
X * as appropriate. No return value.
X *
X * FUNCTIONS TO CHANGE OR QUERY THE SET OF MANAGED APPLICATIONS --
X * Boolean
X * roomManageApp(pRoom,pApp)
X * RoomPtr pRoom;
X * AppPtr pApp;
X * Start managing "pApp" in "pRoom." Queries "pApp" for
X * local, default, and current state.
X *
X * May call the feedback function if "pRoom" becomes visible
X * because it is no longer empty.
X *
X * Calls the feedback function to note "roomAppAdded"
X *
X * Returns True for success, False if "pRoom" is NullRoom,
X * "pApp" is NullApp, or if "pApp" (or another App with the
X * same name) is already managed in "pRoom." A Room may *not*
X * manage multiple Apps with the same name.
X *
X * Boolean
X * roomUnmanageApp(pRoom,pApp)
X * RoomPtr pRoom;
X * AppPtr pApp;
X * Stop managing "pApp" in "pRoom."
X *
X * Calls the feedback function to note "roomAppRemoved"
X *
X * May call the feedback function if "pRoom" is hidden because
X * the last local App is removed.
X *
X * Returns True for success, False if "pRoom" is NullRoom,
X * "pApp" is NullApp, or "pApp" is not being managed by "pRoom."
X *
X * AppPtr
X * roomLookupManagedApp(pRoom,appName)
X * RoomPtr pRoom;
X * StringToken appName;
X * Returns a pointer to the App named "appName" being managed
X * by "pRoom," or NullApp if "pRoom" is NullRoom, "appName"
X * is NullStringToken, or "pRoom" does not manage an App named
X * "appName." A Room may *not* manage more than one App with
X * the same name.
X *
X * FUNCTIONS TO CHANGE, CHECK, OR QUERY THE STATE OF AN APP IN A ROOM
X * Boolean
X * roomAppRealStateChanged(pRoom,pApp,pReal)
X * RoomPtr pRoom;
X * AppPtr pApp;
X * AppStatePtr pReal;
X * Note that the real state of "pApp" has changed, and that the
X * change should be reflected in "pRoom." If "pApp" has a state
X * local to "pRoom", the local state is updated to reflect the
X * changes in pReal. If "pApp" does not have a state local to
X * "pRoom," roomAppRealStateChanged creates a new local state
X * and modifies to reflect the values in "pReal."
X *
X * Note that any bolted values in the local or default state will
X * *not* be changed to reflect "pReal." See appstate.h and app.h
X * for a more complete discussion of copying or matching <real>
X * and <profile> states and of bolts.
X *
X * If "pRoom's" visibility changes due to a change in the number
X * of local apps, roomAppRealStateChanged calls the feedback
X * function to note the change.
X *
X * If "pRoom" is active, and "pReal" does not match the new
X * local state (i.e. if any fields in the local state are
X * bolted and different than "pReal"), roomAppRealStateChanged
X * (re)sets the current state of "pApp" to reflect the new
X * local state.
X *
X * Returns True for success, False if "pRoom" is NullRoom,
X * "pApp" is NullApp, "pReal" is not a legal <real> state,
X * "pApp" is not managed in "pRoom," or if an allocation
X * failure occurs.
X *
X * Boolean
X * roomChangeAppLocalState(pRoom,pApp,pProf)
X * RoomPtr pRoom;
X * AppPtr pApp;
X * AppStatePtr pProf;
X * Change the local state of "pApp" to "pProf." If "pApp"
X * does not have a state local to "pRoom," a new local state is
X * created and "pProf" is copied into it. Note that
X * roomChangeAppLocalState does *not* respect bolts.
X *
X * If "pRoom" is active, and the current real state of "pApp"
X * does not match "pProf," roomChangeAppLocalState tries
X * to reset the current state to match the new local state.
X *
X * If "pRoom's" visibility changes due to a change in the number
X * of local apps, roomChangeAppLocalState calls the feedback
X * function to note the change.
X *
X * Returns True for success, False if "pRoom" is NullRoom,
X * "pApp" is NullApp, "pProf" is not a legal <profile>
X * state, "pApp" is not managed in "pRoom," or an allocation
X * fails.
X *
X * Boolean
X * roomCheckAppStates(pRoom,pApp)
X * RoomPtr pRoom;
X * AppPtr pApp;
X * Check the current, local, and default states of "pApp" in
X * "pRoom" to make sure they are up to date.
X *
X * If "pRoom" is active and the re-synchronized current state
X * does not match the visible state, roomCheckAppStates
X * updates the current state.
X *
X * Use this function to update a Room whenever some other package
X * has changed "pApp."
X *
X * If room visibility changes (due to a change in the number of
X * local Apps), roomCheckAppState calls the feedback func.
X *
X * Returns True for success, False if "pRoom" is NullRoom,
X * "pApp" is NullApp, or "pRoom" does not manage "pApp."
X *
X * AppStatePtr
X * roomGetVisibleState(pRoom,pApp)
X * RoomPtr pRoom;
X * AppPtr pApp;
X * Returns the visible state of "pApp" in "pRoom," or False
X * if "pRoom" is NullRoom, "pApp" is NullApp, or "pApp" is
X * not managed in "pRoom."
X *
X * FUNCTIONS TO CHANGE/QUERY ROOM VISIBILITY --
X * Boolean
X * roomIsVisible(pRoom)
X * RoomPtr pRoom;
X * Returns True if "pRoom" is visible, False if "pRoom" is
X * NullRoom or hidden.
X *
X * Boolean
X * roomSetVisibility(pRoom,visibility,check)
X * RoomPtr pRoom;
X * Boolean visibility;
X * Boolean check;
X * Change the visibility of "pRoom" to "visibility." If
X * "check" is True, roomSetVisibility checks for the
X * automatic visibility controls roomAlways, roomWhenActive,
X * and roomWhenNonEmpty and sets Visible/Hidden appropriately.
X * Calls feedback if visibility changes.
X * Returns True for success, False if "pRoom" if NullRoom.
X *
X * Boolean
X * roomCheckVisibility(pRoom)
X * RoomPtr pRoom;
X * Check to make sure that the visibility of "pRoom" is
X * correct with respect to any automatic visibility controls
X * defined for "pRoom." If visibility is incorrect,
X * roomCheckVisibility corrects visibility and calls the
X * feedback function.
X *
X * Returns True for success, False if "pRoom" is NullRoom.
X *
X * unsigned
X * roomGetVisibility(pRoom)
X * RoomPtr pRoom;
X * Returns the visibility of "pRoom," or roomHidden if "pRoom"
X * is NullRoom.
X *
X * FUNCTIONS TO ACTIVATE/DEACTIVATE A ROOM --
X * Boolean
X * roomIsActive(pRoom)
X * RoomPtr pRoom;
X * Returns True if "pRoom" is not NullRoom and is active, False
X * otherwise.
X *
X * Boolean
X * roomActivate(pRoom)
X * RoomPtr pRoom;
X * Activates "pRoom." If "pRoom" is inactive, roomActivate
X * checks the current state of all Apps managed by "pRoom" and
X * changes any that don't match their visible state in "pRoom."
X * Calls the feedback function if visibility changes, and again
X * if "pRoom" was not active.
X *
X * Returns True for success, False if "pRoom" is NullRoom.
X *
X * Boolean
X * roomDeactivate(pRoom)
X * RoomPtr pRoom;
X * Deactivates "pRoom." Does not change the state of any
X * Apps. Calls the feedback function if visibility changes and
X * if "pRoom" was active.
X * Returns True for success, False if "pRoom" is NullRoom.
X *
X *
X * MISCELLANEOUS ACCESS FUNCTIONS --
X * StringToken
X * roomName(pRoom)
X * RoomPtr pRoom;
X * Returns the name of "pRoom," or NullStringToken if "pRoom"
X * is NullRoom.
X *
X * unsigned
X * roomNumApps(pRoom)
X * RoomPtr pRoom;
X * Returns the number of Apps managed by "pRoom," or 0 if
X * pRoom is NullRoom.
X *
X * unsigned
X * roomNumLocalApps(pRoom);
X * RoomPtr pRoom;
X * Returns the number of managed Apps that have a state local to
X * "pRoom," or 0 if pRoom is NullRoom.
X *
X * void
X * roomSetFeedback(pRoom,pFunc)
X * RoomPtr pRoom;
X * RoomFeedbackFunc pFunc;
X * Set the feedback function of "pRoom" to "pFunc." No
X * return value.
X *
X * RoomFeedbackFunc
X * roomGetFeedback(pRoom)
X * RoomPtr pRoom;
X * Returns the feedback function of "pRoom," or NULL if
X * "pRoom" is NullRoom.
X *
X * void
X * roomSetPrivate(pRoom,priv)
X * RoomPtr pRoom;
X * Opaque priv;
X * Sets the private value associated with "pRoom" to
X * "priv." No return value.
X *
X * Opaque
X * roomGetPrivate(pRoom)
X * RoomPtr pRoom;
X * Returns the private value associated with "pRoom," or
X * NULL if pRoom is NullRoom.
X *
X * ITERATORS
X * void
X * roomIterateApps(pRoom,pFunc,arg)
X * RoomPtr pRoom;
X * RoomIterFunc pFunc;
X * Opaque arg;
X * Calls "pFunc" with (pApp,pLocal,pDflt,pReal) for each of the
X * Apps managed by "pRoom" in turn. Stops iterating if
X * "pFunc" returns False.
X *
X * void
X * roomIterateLocalApps(pRoom,pFunc,arg)
X * RoomPtr pRoom;
X * RoomIterFunc pFunc;
X * Opaque arg;
X * Calls "pFunc" with (pApp,pLocal,pDflt,pReal) for each of the
X * Apps with a local state in "pRoom" in turn. Stops iterating
X * if "pFunc" returns False.
X *
X \*/
X
X#include "strtbl.h"
X#include "app.h"
X
Xtypedef struct _RoomRec *RoomPtr;
X#define NullRoom ((RoomPtr)NULL)
X
Xtypedef void (*RoomFeedbackFunc)(/* pRoom, newState, pApp */);
Xtypedef Boolean (*RoomIterFunc)(/* pApp, pLocal, pDflt, pReal, arg */);
X
X /*
X * Types of feedback
X */
X#define roomFBCreated ((unsigned)1<<0)
X#define roomFBDestroyed ((unsigned)1<<1)
X#define roomFBActivated ((unsigned)1<<2)
X#define roomFBDeactivated ((unsigned)1<<3)
X#define roomFBHidden ((unsigned)1<<4)
X#define roomFBVisible ((unsigned)1<<5)
X#define roomFBAppAdded ((unsigned)1<<6)
X#define roomFBAppRemoved ((unsigned)1<<7)
X
X /*
X * Settings for Room visibility
X */
X#define roomHidden ((unsigned)0)
X#define roomVisible ((unsigned)1<<0)
X#define roomWhenNonEmpty ((unsigned)1<<1)
X#define roomWhenActive ((unsigned)1<<2)
X#define roomAlways ((unsigned)1<<3)
X
X /*
X * public package globals
X */
X#define ROOM_DEFAULT_APP_SLOTS 17
X#define ROOM_DEFAULT_VISIBILITY (roomWhenActive|roomWhenNonEmpty)
Xextern unsigned roomDebug;
Xextern unsigned roomDefaultAppSlots;
Xextern unsigned roomDefaultVisibility;
Xextern Boolean roomIconifyFirst;
X
Xextern char *roomText(/* pRoom */);
Xextern void roomDebugPrint(/* pRoom */);
X
Xextern RoomPtr roomCreate(/* name, priv, feedback */);
Xextern void roomDestroy(/* pRoom */);
X
Xextern Boolean roomManageApp(/* pRoom, pApp */);
Xextern Boolean roomUnmanageApp(/* pRoom,pApp */);
Xextern AppPtr roomLookupManagedApp(/*pRoom,appName*/);
X
Xextern Boolean roomAppRealStateChanged(/* pRoom, pApp, pReal */);
Xextern Boolean roomChangeAppLocalState(/* pRoom, pApp, pProf */);
Xextern Boolean roomCheckAppStates(/* pRoom, pApp */);
Xextern AppStatePtr roomGetVisibleState(/* pRoom, pApp */);
X
Xextern Boolean roomIsVisible(/* pRoom */);
Xextern Boolean roomSetVisibility(/* pRoom, visibility, check */);
Xextern unsigned roomGetVisibility(/* pRoom */);
X
Xextern Boolean roomIsActive(/* pRoom */);
Xextern Boolean roomActivate(/* pRoom */);
Xextern Boolean roomDeactivate(/* pRoom */);
X
Xextern StringToken roomName(/* pRoom */);
Xextern unsigned roomNumApps(/* pRoom */);
Xextern unsigned roomNumLocalApps(/* pRoom */);
Xextern void roomSetFeedback(/* pRoom, pFunc */);
Xextern RoomFeedbackFunc roomGetFeedback(/* pRoom */);
Xextern void roomSetPrivate(/* pRoom, priv */);
Xextern Opaque roomGetPrivate(/* pRoom */);
X
Xextern void roomIterateApps(/* pRoom, pFunc, arg */);
Xextern void roomIterateLocalApps(/* pRoom, pFunc, arg */);
X#endif /* ROOM_H */
END_OF_FILE
if test 17316 -ne `wc -c <'./lib/room.h'`; then
echo shar: \"'./lib/room.h'\" unpacked with wrong size!
fi
# end of './lib/room.h'
fi
echo shar: End of archive 10 \(of 14\).
cp /dev/null ark10isdone
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