v05i061: Xrooms -- A Rooms implementation for X, Part11/14
Kent Landfield
kent at ssbell.IMD.Sterling.COM
Mon Jan 15 17:18:44 AEST 1990
Submitted-by: wsl.dec.com!mikey (Mike Yang)
Posting-number: Volume 5, Issue 61
Archive-name: xrooms/part11
#! /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 11 (of 14)."
# Contents: ./lib/appstate.h ./xrooms/xrApp.c
# Wrapped by kent at ssbell on Sun Jan 14 21:58:13 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f './lib/appstate.h' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./lib/appstate.h'\"
else
echo shar: Extracting \"'./lib/appstate.h'\" \(20723 characters\)
sed "s/^X//" >'./lib/appstate.h' <<'END_OF_FILE'
X#ifndef APPSTATE_H
X#define APPSTATE_H 1
X
X /*\
X * $Header: appstate.h,v 5.0 90/01/10 06:53:13 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 * A positive specification of X or Y means that the defined value
X * refers to the left or top edge of a window. A negative X or Y
X * specification means that the defined value refers to the right
X * or bottom edge of the window.
X *
X * A number of these functions distinguish between <real> AppStates
X * and <profile> AppStates:
X * <real> AppStates must be fully specified with positive X and Y.
X * NullAppState is not a legal <real> AppState.
X * <profile> AppStates may be partially specified and may have
X * negative X and Y. <profile> AppStates may not have window state
X * Inactive or Withdrawn. NullAppState is a legal <profile> state
X * with no values specified for any field.
X * It is an error to try to change any values in NullAppState.
X * By convention, the variable "pReal" should always refer to a
X * <real> AppState and "pProf" should always refer to a <profile>
X * AppState.
X *
X * Values in a <profile> AppState may be "bolted." A bolted value
X * is not affected by values in a <real> state. i.e. Copying a
X * <real> state into a bolted state does not change any bolted values.
X *
X * Bolts may be "loose." A loose bolt has no effect, but may be
X * rebolted. Rebolting does not affect values that do not have loose
X * bolts.
X *
X * PUBLIC PACKAGE GLOBALS --
X * unsigned asDebug; [ default: 0 ]
X * Debugging flags. The only flag currently used is ENTER (0x10)
X * defined in ../utils/utils.h, which tracks function entry and
X * exit.
X *
X * AppStatePtr asDefaultReal; [ default: [ inactive =0x0+0+0] ]
X * AppStatePtr asDefaultProfile; [ default: [ iconic ] ]
X * Default values for <real> and <profile> states respectively.
X *
X * DEBUGGING FUNCTIONS --
X * char *
X * asWinStateText(winState)
X * WinState winState;
X * Returns a string containing a description of "winState."
X * This string is stored in a static buffer so it must *not*
X * be freed and may be clobbered by subsequent calls to
X * asWinStateText.
X *
X * char *
X * asText(pState)
X * AppStatePtr pState;
X * Returns a string containing a description of "pState."
X * This string is a static buffer so it must *not* be freed
X * and may be clobbered by subsequent calls to asText.
X *
X * FUNCTIONS FOR DEALING WITH NEGATIVE SPECIFICATIONS OF X AND Y --
X * void
X * asSetScreenSize(width,height)
X * unsigned width,height;
X * Set the screen size for future conversions to and from negative
X * specifications of X and Y.
X *
X * Boolean
X * asChangeProfileFlags(pReal,pProf,pNewFlags)
X * AppStatePtr pReal,pProf;
X * unsigned pNewFlags;
X * Change the specification of "pProf" to contain all of (and only)
X * the fields defined in pNewFlags, taking any missing values from
X * pReal. "asChangeProfileFlags" will compute negative X and
X * Y specifications if defined in "pNewFlags."
X * asChangeProfileFlags ignores bolts.
X * Returns True if it succeeds, False if pReal is not a legal
X * <real> state or pProf is NullAppState or not a legal <profile>
X * state.
X *
X * Boolean
X * asGetScreenValues(pReal, pProf, pWinState, pX, pY, pWidth, pHeight)
X * AppStatePtr pReal, pProf;
X * WinState *pWinState; // RETURN
X * int *pX,*pY; // RETURN
X * unsigned *pWidth, *pHeight; // RETURN
X * Computes the positive screen coordinates of "pProf" and returns
X * the values in the return arguments pWinState, pX, pY, pWidth
X * and pHeight. Any of the return arguments may be NULL without
X * error if the calling function does not use the value of that
X * field.
X * Returns True for success, False if pReal is not a legal <real>
X * state or pProf is not a legal <profile> state.
X *
X * FUNCTIONS TO CREATE AND DESTROY APPLICATION STATES --
X * AppStatePtr
X * asCreate(flags, winState, x, y, width, height)
X * unsigned flags;
X * WinState winState;
X * int x,y;
X * unsigned width,height;
X * Creates an AppState with the specified values. Does *not*
X * compute negative X or Y. Returns NullAppState on allocation
X * failure.
X *
X * AppStatePtr
X * asDupFully(pState)
X * Creates a faithful (i.e. unmodified) duplicate of "pState."
X * All of fields and bolts that are set in "pState" will be set
X * to the same values in the newly created AppState.
X * Returns NullAppState on allocation failure.
X * If "pState" is NullAppState, "asDupFully" returns a
X * AppStatePtr with no values defined; it does *not* return
X * NullAppState.
X *
X * AppStatePtr
X * asDupReal(pReal, flags)
X * AppStatePtr pReal;
X * unsigned flags;
X * Creates a duplicate of "pReal" (which *must* be a legal real
X * AppState). The fields specified in "flags" will be set to
X * the appropriate values from "pReal." Correct values for
X * negative X and Y values *are* calculated.
X * Use this function to create a new partial or negative
X * specification from a real window state.
X * Returns NullAppState on allocation failure or if "pReal"
X * is not a legal <real> AppState.
X *
X * void
X * asDestroy(pState)
X * AppStatePtr pState;
X * Destroys "pState." Attempts to use an AppState after it
X * has been destroyed may be disastrous. No return value.
X *
X
X *
X * FUNCTIONS TO COPY, CONVERT, AND MODIFY APPLICATION STATES --
X * Boolean
X * asCopyFully(pFrom, pInto)
X * AppStatePtr pFrom, pInto;
X * Faithfully (i.e. without conversion) copies "pFrom" into
X * "pInto." Sets all of the fields and bolts that are defined
X * in "pFrom" to their same values in "pInto." Former values
X * of "pInto" are lost.
X * If "pFrom" is NullAppState, "pInto" is changed to have
X * no values defined, but the copy is successful.
X * Returns True for a successful copy, False if "pInto" is
X * NullAppState.
X *
X * Boolean
X * asCopySelected(pFrom, pInto, flags)
X * AppStatePtr pFrom,pInto;
X * unsigned flags;
X * Copies selected values from "pFrom" into "pInto." Only
X * copies those values that are defined in both "pFrom" and
X * "flags." Does not compute values for negative X or Y
X * specifications in pFrom, but does copy the XNegative and
X * YNegative flags if set in "flags."
X * Returns True if the copy is successful, False if any of
X * the fields specified in "flags" are not defined in "pFrom."
X *
X * Boolean
X * asCopyRealToProfile(pRealFrom, pProfInto)
X * AppStatePtr pRealFrom, pProfInto;
X * Copies values from "pRealFrom" into "pProfInto." Only
X * copies those values that are specified in "pProfInto," and
X * are not bolted. Computes correct values for negative X or
X * Y specifications in "pProfInto."
X * Returns True for a successful copy, False if pRealFrom is
X * not a legal <real> state, pProfInto is not a legal <profile>
X * state, or pProfInto is NullAppState.
X *
X * Boolean
X * asCopyProfileToReal(pProfFrom, pRealInto)
X * AppStatePtr pProfFrom,pRealInto;
X * Copies values from "pProfFrom" into "pRealInto." Only
X * copies those values that are defined in "pProfFrom."
X * Computes correct values for negative X or Y specifications in
X * pProfFrom.
X * Returns True if the copy is successful, False if pProfFrom
X * is not a legal <profile> state or pRealInto is not a legal
X * <real> state.
X *
X * Boolean
X * asChangeSelected(pState, flags, winState, x, y, width, height)
X * AppStatePtr pState;
X * unsigned flags;
X * WinState winState;
X * int x,y;
X * unsigned width,height;
X * Changes selected values in "pState." Changes only values
X * specified in "flags." Changes settings for X or Y Negative
X * if both the Value *and* negative fields are set in "flags,"
X * but does *not* compute values for x or y. Values not
X * specified in "flags" are unchanged.
X * Returns True for success, False if "pState" is NullAppState.
X *
X * Boolean
X * asChangeAll(pState, flags, winState, x, y, width, height )
X * AppStatePtr pState;
X * unsigned flags;
X * WinState winState;
X * int x,y;
X * unsigned width,height;
X * Changes all values in "pState" to those specified in "flags."
X * Does affect XNegative and YNegative, but does not compute
X * values for X and Y (assumes it is called with correctly
X * computed values). Old values from "pState" are lost.
X * Returns True for suceessful change, False if "pState"
X * is NullAppState.
X *
X * Boolean
X * asBolt(pState,which)
X * AppStatePtr pState;
X * unsigned which;
X * Bolts the fields specified by "which" in "pState." If
X * any of the specified fields have loose bolts, those bolts
X * are tightened. Fields that are already bolted are not
X * affected.
X * Returns True for success, False if "pState" is NullAppState.
X *
X * Boolean
X * asUnbolt(pState,which)
X * AppStatePtr pState;
X * unsigned which;
X * Unbolts the fields specified by "which" in "pState." If
X * any of the specified fields have loose bolts, those bolts
X * are fully removed. Fields without bolts are unaffected.
X * Returns True for success, False if "pState" is NullAppState.
X *
X * Boolean
X * asLoosenBolts(pState,which)
X * AppStatePtr pState;
X * unsigned which;
X * Loosens (temporarily unbolts) the fields specified by "which"
X * in pState. Fields without bolts or with loose bolts are
X * unaffected.
X * Returns True for success, False if "pState" is NullAppState.
X *
X * Boolean
X * asTightenBolts(pState,which)
X * AppStatePtr pState;
X * unsigned which;
X * Tightens (re-bolts fields that were temporarily unbolted) the
X * fields specified by "which" in "pState." Fields without
X * loose bolts are unaffected.
X * Returns True for success, False if "pState" is NullAppState.
X *
X * Boolean
X * asSetBolts(pState,which)
X * AppStatePtr pState;
X * unsigned which;
X * Bolts only the fields specified by "which" in "pState." If
X * any of the specified fields have loose bolts, those bolts
X * are tightened. Fields that are previously bolted that are
X * are not specified in "which" are unbolted.
X * Returns True for success, False if "pState" is NullAppState.
X *
X * Boolean
X * asSetLooseBolts(pState,which)
X * AppStatePtr pState;
X * unsigned which;
X * Sets the loose bolts in "pState" to be only the fields
X * specified by "which." Any of the specified fields which are
X * bolted are loosened. Tightens the bolts of any fields that
X * are not specified in "which" but have loose bolts.
X * Returns True for success, False if "pState" is NullAppState.
X *
X * FUNCTIONS TO GET INFORMATION ABOUT APPLICATON STATES --
X * unsigned
X * asValues(pState, pWinState, pX, pY, pWidth, pHeight)
X * AppStatePtr pState;
X * WinState *pWinState;
X * int *pX,*pY; // RETURN
X * unsigned *pWidth,*pHeight; // RETURN
X * Use asValues to find out the value of any of the components
X * of a AppState. Returns the fields defined and values of
X * XNegative and YNegative for "pState". Stores the values of
X * any defined fields in the return arguments "pWinState," "pX,"
X * "pY," "pWidth," and "pHeight." If x or y has a negative
X * specification and width or height is defined, asValues will
X * calculate the positive (left or top) value and will
X * *not* return asXNegative or asYNegative. If the x or y
X * specification is negative but width or height is not defined,
X * the right or top side value is returned along wth asXNegative
X * (asYNegative).
X * Any of the return arguments may be NULL, and only those values
X * defined in the AppState will be changed.
X * Returns asNoValue if "pState" is NullAppState.
X *
X * WinState
X * asWinState(pState)
X * AppStatePtr pState;
X * Returns in the window state of "pState," or asInactive if
X * "pState" is NullAppState, or "pState" has no defined
X * value for window state.
X *
X * unsigned
X * asFlags(pState)
X * AppStatePtr pState;
X * Returns the fields defined and values for XNegative and
X * YNegative of "pState." Returns asNoValue if "pState" is
X * NullAppState.
X *
X * unsigned
X * asBolts(pState)
X * AppStatePtr pState;
X * Returns a mask of the fields that are currently bolted in
X * "pState." Does not report loose bolts.
X * Returns asNoValue if "pState" is NullAppState.
X *
X * unsigned
X * asLooseBolts(pState)
X * AppStatePtr pState;
X * Returns a mask of the fields that are currently temporarily
X * unbolted in "pState." Does not return fields that are
X * fully bolted or unbolted.
X * Returns asNoValue if "pState" is NullAppState.
X *
X * FUNCTIONS TO COMPARE APPLICATION STATES --
X * Boolean
X * asProfileCorrectWRToReal(pProf, pReal)
X * AppStatePtr pProf,pReal;
X * Returns True if "pProf" is correct with respect to
X * "pReal."
X * A <profile> AppState is correct WRT a <real> AppState
X * IFF all of the values that are defined in the <profile>
X * AppState and are *not* bolted match the corresponding values in
X * the <real> AppState (i.e. undefined or bolted values in the
X * <profile> AppState are always correct WRT the corresponding
X * value in the <real> AppState).
X * Window states asWithdrawn and asInactive in a <real>
X * AppState match any state in a <profile> AppState.
X * Values for X and Y match if they refer to the same point
X * on the screen. Values for width and height must be the
X * same if defined. For example: If the screen is 1000x1000,
X * the <profile> AppStates [ Normal =-100-100 ] and
X * [ =+800+800 ] both match the <real> AppState
X * [ Normal =100x100+800+800 ].
X * Use this function to determine if the <profile> AppState
X * "pProf" must be modified to match a change in the corresponding
X * <real> AppState "pReal."
X * NOTE: asProfileCorrectWRTReal and asRealMatchesProfile are
X * *NOT* symmetric.
X *
X * Boolean
X * asSelectedProfileCorrectWRToReal(pProf, pReal, which)
X * AppStatePtr pProf,pReal;
X * unsigned which;
X * Like asProfileCorrectWRTToReal, but only compares
X * fields specified in "which."
X *
X * Boolean
X * asRealMatchesProfile(pReal,pProf)
X * AppStatePtr pReal,pProf;
X * Returns True if "pReal" matches "pProf."
X * A <real> AppState matches a <profile> AppState IFF all of the
X * values in the <real> AppState match those elements of the
X * corresponding <profile> AppState that are defined. Undefined
X * values in the profile AppState always match the corresponding
X * value in the the <real> AppState. Bolts in the <profile>
X * AppState do not affect matches.
X * Window states and values for x, y, width, and height match as
X * they do for asProfileCorrectWRTReal.
X * Use this function to determine if the <real> AppState "pReal"
X * must be changed to correspond to the <profile> AppState
X * "pProf."
X * NOTE: asRealMatchesProfile and asProfileCorrectWRTReal are
X * *NOT* symmetric.
X *
X * Boolean
X * asSelectedRealMatchProfile(pReal,pProf,which)
X * AppStatePtr pReal,pProf;
X * unsigned which;
X * Like asRealMatchesProfile, but only compares fields specified
X * in "which."
X *
X * Boolean
X * asFullySame(pState1, pState2)
X * AppStatePtr pState1,pState2;
X * Returns True if "pState1" and "pState2" have the same fields
X * and bolts defined, the same values for XNegative and
X * YNegative, and all fields have the same value.
X *
X * Boolean
X * asSelectedSame(pState1, pState2, which)
X * AppStatePtr pState1,pState2;
X * unsigned which;
X * Returns True if all of the fields and bolts specified in
X * "which" have the same values in "pState1" and "pState2."
X * Does *not* compute positive values of X and Y.
X *
X * FUNCTIONS TO DETERMINE OTHER USEFUL THINGS ABOUT APPLICATION STATES
X * Boolean
X * asLegalReal(pState)
X * AppStatePtr pState;
X * Returns True if "pState" is a legal <real> AppState, False
X * otherwise. NullAppState is not a legal <real> AppState.
X *
X * Boolean
X * asLegalProfile(pState)
X * AppStatePtr pState;
X * Returns True if "pState" is a legal <profile> AppState,
X * False otherwise. NullAppState is a legal <profile> AppState.
X *
X * Boolean asDontCare(pState)
X * AppStatePtr pState;
X * Returns True if "pState" is NullAppState or if none of the
X * values in pState are defined.
X *
X \*/
X
X/*\
X
X\*/
X
Xtypedef struct _AppStateRec *AppStatePtr;
X#define NullAppState ((AppStatePtr)NULL)
X
X /*\
X * All of these flags except asWinStateValue must be the same as
X * the corresponding value in X11/Xutil.h.
X * asWinStateValue must not conflict with any of the flags in
X * X11/Xutil.h
X *
X * these flags are used to determine which fields of an AppState
X * are defined, and whether the X and Y values are positive or
X * negative specifications.
X \*/
X
X#define asNoValue ((unsigned)0x0000)
X#define asXValue ((unsigned)0x0001)
X#define asYValue ((unsigned)0x0002)
X#define asWidthValue ((unsigned)0x0004)
X#define asHeightValue ((unsigned)0x0008)
X
X#define asWinStateValue ((unsigned)0x0100)
X
X#define asPosValues (asXValue|asYValue)
X#define asSizeValues (asWidthValue|asHeightValue)
X#define asGeomValues (asPosValues|asSizeValues)
X#define asAllValues (asGeomValues|asWinStateValue)
X
X#define asXNegative ((unsigned)0x0010)
X#define asYNegative ((unsigned)0x0020)
X#define asSignFlags (asXNegative|asYNegative)
X
X#define asLegalFlags (asAllValues|asSignFlags)
X
X /*\
X * Most of these values are *not* arbitrary. asWithdrawn,
X * asIconic, and asNormal *must* correspond to the ICCCM.
X * The other values should not conflict with the ICCCM.
X \*/
Xtypedef int WinState;
X
X#define asInactive ((WinState)-1)
X#define asWithdrawn ((WinState)0)
X#define asNormal ((WinState)1)
X#define asIconic ((WinState)3)
X
Xextern unsigned int asDebug;
Xextern AppStatePtr asDefaultReal;
Xextern AppStatePtr asDefaultProfile;
X
Xextern char *asWinStateText(/* pState */);
Xextern char *asText(/* pState */);
X
Xextern void asSetScreenSize( /*width, height*/ );
Xextern Boolean asChangeProfileFlags(/* pReal, pProf, pNewFlags */);
Xextern Boolean asGetScreenValues(/*pReal,pProf,pWState,pX,pY,pW,pH*/);
X
Xextern AppStatePtr asCreate(/* flags, winState, x, y, width, height */);
Xextern AppStatePtr asDupFully(/* pState */);
Xextern AppStatePtr asDupReal(/* pReal, flags*/);
Xextern void asDestroy(/* pState */);
X
Xextern Boolean asCopyFully(/* pOldAppState, pNewAppState */);
Xextern Boolean asCopySelected(/*pFrom, pInto, flags*/);
Xextern Boolean asCopyRealToProfile(/* pReal, pProf */);
Xextern Boolean asCopyProfileToReal(/* pProf, pReal */);
X
Xextern Boolean asChangeSelected(/*pState,flags,winState,x,y,w,h*/);
Xextern Boolean asChangeAll(/*pState,flags,winState,x,y,width,height*/);
X
Xextern Boolean asBolt(/*pState,which*/);
Xextern Boolean asUnbolt(/*pState,which*/);
Xextern Boolean asLoosenBolts(/*pState,which*/);
Xextern Boolean asTightenBolts(/*pState,which*/);
Xextern Boolean asSetBolts(/*pState,which*/);
Xextern Boolean asSetLooseBolts(/*pState,which*/);
X
Xextern unsigned asValues(/* pState, pWState,pX, pY, pWidth, pHeight */);
Xextern unsigned asFlags(/*pState*/);
Xextern unsigned asBolts(/*pState*/);
Xextern unsigned asLooseBolts(/*pState*/);
X
Xextern Boolean asProfileCorrectWRTReal(/* pProf, pReal */);
Xextern Boolean asSelectedProfileCorrectWRTReal(/*pProf,pReal,which*/);
Xextern Boolean asRealMatchesProfile(/* pReal, pProf */);
Xextern Boolean asSelectedRealMatchProfile(/* pReal, pProf, which */);
Xextern Boolean asFullySame(/* pState1, pState2 */);
Xextern Boolean asSelectedSame(/* pState1, pState2, which */);
X
Xextern Boolean asLegalReal(/* pState */);
Xextern Boolean asLegalProfile(/* pState */);
Xextern Boolean asDontCare(/* pState */);
X
X#endif /* APPSTATE_H */
END_OF_FILE
if test 20723 -ne `wc -c <'./lib/appstate.h'`; then
echo shar: \"'./lib/appstate.h'\" unpacked with wrong size!
fi
# end of './lib/appstate.h'
fi
if test -f './xrooms/xrApp.c' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'./xrooms/xrApp.c'\"
else
echo shar: Extracting \"'./xrooms/xrApp.c'\" \(20206 characters\)
sed "s/^X//" >'./xrooms/xrApp.c' <<'END_OF_FILE'
X
X /*\
X * $Header: xrApp.c,v 5.2 90/01/11 14:08:41 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 xrAppDebug
X#include "utils.h"
X#include "hash.h"
X#include "regex.h"
X
X#include "appstate.h"
X#include "apps.h"
X#include "nameprof.h"
X
X#include "xrDebug.h"
X#include "xrXUtils.h"
X#include "xrApp.h"
X#include "xrooms.h"
X
X#include "xrGen.h"
X
XBoolean xraNonICCCM;
XBoolean xraUseWindowNames;
XBoolean xraDfltAppsTransient;
XBoolean xraUseGeometries;
XBoolean xraReopenForGeom;
XBoolean xraUnmapForState,xraUnmapForGeom;
XBoolean xraManageTransients;
XBoolean xraManageWithdrawn;
X
XHashTablePtr xraXApps;
X
X/***====================================================================***/
X
Xvoid
XxraDebugPrint()
X{
XOpaque istate;
XGenKey key;
XGenData data;
XAppPtr pApp;
XXAppInfoPtr pXInfo;
X
X if (xraXApps!=NullHashTable) {
X htIterator(xraXApps,key,data,istate) {
X pApp= (AppPtr)data;
X pXInfo= (XAppInfoPtr)appGetOutputPriv(pApp);
X uDebug("0x%x= %s\n",data,appText(pApp));
X if (data==(GenData)pXInfo->client) {
X uDebug(" parent=0x%x,client=0x%x\n",pXInfo->parent,
X pXInfo->client);
X }
X }
X htEndIterator(istate);
X }
X return;
X
X}
X
X/***====================================================================***/
X
XAppPtr
XxraLookupWindowApp(win)
XWindow win;
X{
XAppPtr pApp;
X uENTRY1("xraLookupWindowApp(0x%x)\n",win);
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)win);
X uRETURN(pApp);
X}
X
X/***====================================================================***/
X
Xstatic Bool
XxraFindMissingEvents(qDpy,pEvent,pXInfo)
XDisplay *qDpy;
XXEvent *pEvent;
XXAppInfoPtr pXInfo;
X{
XBoolean handled= False;
X
X uENTRY3("xraFindMissingEvents(0x%x,0x%x,0x%x)\n",qDpy,pEvent,pXInfo);
X switch (pEvent->type) {
X case ConfigureNotify:
X if (pEvent->xconfigure.window==pXInfo->client) {
X if ((pEvent->xconfigure.send_event)&&
X WantsX(pXInfo,pEvent->xconfigure.x)&&
X WantsY(pXInfo,pEvent->xconfigure.y)) {
X GotX(pXInfo);
X GotY(pXInfo);
X uDEBUG2(WATCH_EVENTS,"sneaking away config pos=(%d,%d)\n",
X pEvent->xconfigure.x,pEvent->xconfigure.y);
X handled= True;
X }
X else if (WantsWidth(pXInfo,pEvent->xconfigure.width)&&
X WantsHeight(pXInfo,pEvent->xconfigure.height)) {
X GotWidth(pXInfo);
X GotHeight(pXInfo);
X uDEBUG2(WATCH_EVENTS,"sneaking away config size=(%d,%d)\n",
X pEvent->xconfigure.width,pEvent->xconfigure.height);
X handled= True;
X }
X }
X break;
X case PropertyNotify:
X if ((pEvent->xproperty.window==pXInfo->client)&&
X (pEvent->xproperty.atom == WM_STATE)) {
X WinState winState= xruGetState(pXInfo->client,False);
X if (WantsState(pXInfo,winState)) {
X GotState(pXInfo);
X handled= True;
X }
X }
X break;
X case ClientMessage:
X if ((pEvent->xclient.window==pXInfo->client)&&
X WantsX(pXInfo,pEvent->xclient.data.s[0])&&
X WantsY(pXInfo,pEvent->xclient.data.s[1])) {
X GotX(pXInfo);
X GotY(pXInfo);
X uDEBUG2(WATCH_EVENTS,"sneaking away msg pos=(%d,%d)\n",
X pEvent->xclient.data.s[0],pEvent->xclient.data.s[1]);
X handled= True;
X }
X break;
X }
X uRETURN(handled);
X}
X
X#define MAX_TIMEOUT 2
X
Xstatic Boolean
XxraTryToClear(pXInfo)
XXAppInfoPtr pXInfo;
X{
XXEvent event;
Xint timeout= 0;
X
X uENTRY1("xraTryToClear(0x%x)\n",pXInfo);
X while (WantsAny(pXInfo)&&(timeout<MAX_TIMEOUT)) {
X if (!XCheckIfEvent(xroomsDpy,&event,xraFindMissingEvents,pXInfo)) {
X timeout++;
X sleep(1);
X }
X }
X uRETURN(!WantsAny(pXInfo));
X}
X
X/***====================================================================***/
X
X/* ARGSUSED */
XBoolean
XxraNonICCCMAppUpdate(pApp,pNewState,priv)
XAppPtr pApp;
XAppStatePtr pNewState;
XOpaque priv;
X{
XXAppInfoPtr pXInfo;
XAppStatePtr pOldState;
XBoolean geomChange;
XBoolean reopenWin= False;
X
X uENTRY3("xraNonICCCMAppUpdate(%s,%s,0x%x)\n",appText(pApp),
X asText(pNewState),priv);
X
X uDEBUG2(WATCH_APPS,"Reconfiguring %s\n to %s\n",appText(pApp),
X asText(pNewState));
X pXInfo= (XAppInfoPtr)priv;
X
X#ifdef NOTDEF
X if (WantsAny(pXInfo)&&(!xraTryToClear(pXInfo))) {
X uWarning("app %s waiting for a change (0x%x)\n",appText(pApp),
X pXInfo->wants.flags);
X }
X#endif
X pOldState= pXInfo->pRealState;
X uDEBUG1(WATCH_APPS," from %s\n",asText(pOldState));
X
X geomChange= ((xraUseGeometries)&&
X (!asSelectedSame(pOldState,pNewState,asGeomValues)));
X reopenWin= xraReopenForGeom&&geomChange&&
X (asWinState(pNewState)==asNormal);
X
X if ((reopenWin)||
X (asWinState(pOldState)==asNormal)&&(asWinState(pNewState)==asIconic)) {
X XWMHints hints;
X hints.flags= StateHint;
X
X uDEBUG(WATCH_APPS," iconifying\n");
X hints.initial_state= IconicState;
X if (xraUnmapForState)
X XUnmapWindow(xroomsDpy,pXInfo->client);
X XSetWMHints(xroomsDpy,pXInfo->client,&hints);
X if (xraUnmapForState)
X XMapWindow(xroomsDpy,pXInfo->client);
X XSync(xroomsDpy,False);
X SetWantsState(pXInfo,asIconic);
X }
X if (geomChange) {
X XSizeHints hints;
X int x,y,oldX,oldY;
X unsigned width,height,oldWidth,oldHeight;
X
X asValues(pOldState,(WinState *)NULL,&oldX,&oldY,&oldWidth,&oldHeight);
X asValues(pNewState,(WinState *)NULL,&x,&y,&width,&height);
X hints.flags= 0;
X if ((oldX!=x)||(oldY!=y)) {
X hints.flags|= PPosition;
X hints.x= x;
X hints.y= y;
X uDEBUG(WATCH_APPS," position changed.\n");
X SetWantsPos(pXInfo,x,y);
X }
X if ((oldWidth!=width)||(oldHeight!=height)) {
X hints.flags|= PSize;
X hints.width= width;
X hints.height= height;
X uDEBUG(WATCH_APPS," size changed.\n");
X SetWantsSize(pXInfo,width,height);
X }
X if (hints.flags) {
X uDEBUG(WATCH_APPS," telling X\n");
X
X if ((xraUnmapForGeom)&&(asWinState(pNewState)!=asWithdrawn)) {
X XGrabServer(xroomsDpy);
X XUnmapWindow(xroomsDpy,pXInfo->client);
X XSetNormalHints(xroomsDpy, pXInfo->client, &hints);
X XMoveResizeWindow(xroomsDpy,pXInfo->client,x,y,width,height);
X XMapWindow(xroomsDpy,pXInfo->client);
X XUngrabServer(xroomsDpy);
X }
X else {
X XSetNormalHints(xroomsDpy, pXInfo->client, &hints);
X XMoveResizeWindow(xroomsDpy,pXInfo->client,x,y,width,height);
X }
X }
X }
X if (reopenWin||((asWinState(pOldState)==asIconic)&&
X (asWinState(pNewState)==asNormal))) {
X XWMHints hints;
X hints.flags= StateHint;
X uDEBUG(WATCH_APPS," deiconifying\n");
X hints.initial_state= NormalState;
X if (xraUnmapForState)
X XUnmapWindow(xroomsDpy,pXInfo->client);
X XSetWMHints(xroomsDpy,pXInfo->client,&hints);
X if (xraUnmapForState)
X XMapWindow(xroomsDpy,pXInfo->client);
X XSync(xroomsDpy,False);
X SetWantsState(pXInfo,asNormal);
X }
X uRETURN(True);
X}
X
X/***====================================================================***/
X
X/* ARGSUSED */
XBoolean
XxraAppUpdate(pApp,pNewState,priv)
XAppPtr pApp;
XAppStatePtr pNewState;
XOpaque priv;
X{
XXAppInfoPtr pXInfo;
XAppStatePtr pOldState;
X
X uENTRY3("xraAppUpdate(%s,%s,0x%x)\n",appText(pApp),asText(pNewState),priv);
X
X uDEBUG2(WATCH_APPS,"Reconfiguring %s\n to %s\n",appText(pApp),
X asText(pNewState));
X pXInfo= (XAppInfoPtr)priv;
X
X if (WantsAny(pXInfo)&&(!xraTryToClear(pXInfo))) {
X uWarning("app %s waiting for a change (0x%x)\n",appText(pApp),
X pXInfo->wants.flags);
X }
X pOldState= pXInfo->pRealState;
X uDEBUG1(WATCH_APPS," from %s\n",asText(pOldState));
X
X if ((asWinState(pOldState)==asNormal)&&(asWinState(pNewState)==asIconic)) {
X XEvent event;
X uDEBUG(WATCH_APPS," iconifying\n");
X event.xclient.type= ClientMessage;
X event.xclient.display= xroomsDpy;
X event.xclient.window= pXInfo->client;
X event.xclient.message_type= WM_CHANGE_STATE;
X event.xclient.format= 32;
X event.xclient.data.l[0]= IconicState;
X XSendEvent(xroomsDpy,xroomsRealRoot,False,
X SubstructureRedirectMask|SubstructureNotifyMask,
X &event);
X SetWantsState(pXInfo,asIconic);
X }
X if (xraUseGeometries&&(!asSelectedSame(pOldState,pNewState,asGeomValues))) {
X XSizeHints hints;
X int x,y,oldX,oldY;
X unsigned width,height,oldWidth,oldHeight;
X
X asValues(pOldState,(WinState *)NULL,&oldX,&oldY,&oldWidth,&oldHeight);
X asValues(pNewState,(WinState *)NULL,&x,&y,&width,&height);
X hints.flags= 0;
X if ((oldX!=x)||(oldY!=y)) {
X hints.flags|= PPosition;
X hints.x= x;
X hints.y= y;
X uDEBUG(WATCH_APPS," position changed.\n");
X SetWantsPos(pXInfo,x,y);
X }
X if ((oldWidth!=width)||(oldHeight!=height)) {
X hints.flags|= PSize;
X hints.width= width;
X hints.height= height;
X uDEBUG(WATCH_APPS," size changed.\n");
X SetWantsSize(pXInfo,width,height);
X }
X if (hints.flags) {
X uDEBUG(WATCH_APPS," telling X\n");
X XSetNormalHints(xroomsDpy, pXInfo->client, &hints);
X XMoveResizeWindow(xroomsDpy,pXInfo->client,x,y,width,height);
X }
X }
X if ((asWinState(pOldState)==asIconic)&&(asWinState(pNewState)==asNormal)) {
X uDEBUG(WATCH_APPS," deiconifying\n");
X XMapWindow(xroomsDpy,pXInfo->client);
X SetWantsState(pXInfo,asNormal);
X }
X XFlush(xroomsDpy);
X uRETURN(True);
X}
X
X/***====================================================================***/
X
Xvoid
XxraSetupModeApp(name,pApp,pRealState,win)
Xchar *name;
XAppPtr pApp;
XAppStatePtr pRealState;
XWindow win;
X{
XAppStatePtr pState;
X
X uENTRY4("xraSetupModeApp(%s,%s,%s,0x%x)\n",uStringText(name),appText(pApp),
X asText(pRealState),win);
X if ((pApp!=NullApp)&&(!appIsPermanent(pApp))) {
X pState= appGetDefault(pApp);
X if (asWinState(pRealState)==asIconic) {
X appRemoveAllRoomStates(pApp);
X asCopyFully(pRealState,pState);
X asChangeSelected(pState,asWinStateValue,asIconic,0,0,(unsigned)0,
X (unsigned)0);
X appSetPermanence(pApp,True);
X }
X else if ((win==xroomsMainWindow)||
X regexMatch(".*[xX]?rooms*",name,NULL)||
X regexMatch(".*[cC]lock.*",name,NULL)||
X regexMatch(".*[lL]oad.*",name,NULL)||
X regexMatch(".*[bB]iff.*",name,NULL)||
X regexMatch(".*[iI][cC][oO][nN][ ]*[bB][oO][xX].*",name,NULL)||
X regexMatch(".*[iI][cC][oO][nN][sS].*",name,NULL)) {
X
X if (pState!=NullAppState) {
X asCopyFully(pRealState,pState);
X appRemoveAllRoomStates(pApp);
X appSetPermanence(pApp,True);
X }
X }
X }
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xvoid
XxraAddApp(window)
XWindow window;
X{
XWindow client;
Xint border_width, depth;
XWindow winreturn;
XAppPtr pApp;
Xchar *name,*class;
XStringToken nameToken;
XWinState winState;
XAppStatePtr pState= NullAppState;
Xint x,y;
Xunsigned width,height;
XXAppInfoPtr pXInfo;
X
X uENTRY1("xraAddApp(0x%x)\n",window);
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)window);
X if (pApp!=NullApp) {
X uVOIDRETURN;
X }
X
X if ((client=xruFindClientWindow(window, &winState))==NULL) {
X uVOIDRETURN;
X }
X if ((!xraManageTransients)&&(xruIsTransient(client))) {
X uVOIDRETURN;
X }
X
X if ((pApp= (AppPtr)htLookup(xraXApps,(GenKey)client))!=NullApp) {
X pXInfo= (XAppInfoPtr)appGetOutputPriv(pApp);
X if (pXInfo->client==client) {
X if (pXInfo->parent!=client)
X htRemove(xraXApps,(GenKey)pXInfo->parent);
X pXInfo->parent= window;
X htAdd(xraXApps,(GenKey)window,(GenData)pApp);
X uVOIDRETURN;
X }
X else pApp= NullApp;
X }
X else if (winState==asWithdrawn) {
X uVOIDRETURN;
X }
X
X xrnGetName(client,&name,&class);
X uDEBUG3(WATCH_APPS,"got name %s (class %s) for window 0x%x\n",
X uStringText(name),uStringText(class),client);
X if (name==NullString) {
X if (class==NullString) {
X uVOIDRETURN;
X }
X else {
X name= class;
X class= NullString;
X }
X }
X nameToken= stGetToken(name);
X
X XGetGeometry(xroomsDpy, client, &winreturn, &x, &y, &width, &height,
X &border_width, &depth);
X XTranslateCoordinates(xroomsDpy, client, xroomsRoot,
X -border_width, -border_width,
X &x, &y, &winreturn);
X
X pState= asCreate(asAllValues,winState,x,y,width,height);
X if (pState==NullAppState) {
X uVOIDRETURN;
X }
X pXInfo= uTypedAlloc(XAppInfoRec);
X if (pXInfo==NullXAppInfo) {
X asDestroy(pState);
X uVOIDRETURN;
X }
X
X pApp= GetApp(nameToken,True);
X
X if (xroomsSetupMode) {
X if (winState!=asWithdrawn)
X xraSetupModeApp(name,pApp,pState,client);
X }
X
X if (pApp!=NullApp) {
X uDEBUG4(WATCH_APPS,"New app \"%s\" %x (%x): (%s)\n",
X appText(pApp), window, client, asText(pState));
X SetWantsNone(pXInfo);
X pXInfo->parent= window;
X pXInfo->client= client;
X pXInfo->pRealState= pState;
X XSelectInput(xroomsDpy, client, PropertyChangeMask|StructureNotifyMask);
X if (xraNonICCCM) (void)appSetUpdateFunc(pApp,xraNonICCCMAppUpdate);
X else (void)appSetUpdateFunc(pApp,xraAppUpdate);
X (void)appSetOutputPriv(pApp,(Opaque)pXInfo);
X (void)htAdd(xraXApps,(GenKey)client,(GenData)pApp);
X if (window!=client)
X (void)htAdd(xraXApps,(GenKey)window,(GenData)pApp);
X if (!AppActivated(pApp,pState)) {
X uWarning("couldn't activate app \"%s\"\n",appText(pApp));
X }
X else {
X xrnNoteAppName(client,appText(pApp));
X if (xroomsSetupMode) {
X appSetPermanence(pApp,True);
X }
X }
X }
X else {
X (void)uFree((Opaque)pXInfo);
X uWarning("couldn't create app \"%s\"\n",stText(nameToken));
X }
X if (name==NullString) (void)uFree((Opaque)name);
X if (class==NullString) (void)uFree((Opaque)class);
X
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xvoid
XxraClientResized(client,newW,newH)
XWindow client;
Xunsigned newW,newH;
X{
XAppPtr pApp;
XXAppInfoPtr pXInfo;
XAppStatePtr pState;
XBoolean realChange;
Xunsigned oldW,oldH;
X
X uENTRY3("xraClientResized(0x%x,%d,%d)\n",client,newW,newH);
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)client);
X
X uDEBUG3(WATCH_EVENTS,"Got a resize notify for app %s (=%dx%d)\n",
X appText(pApp),newW,newH);
X
X if (pApp==NullApp) {
X xraAddApp(client);
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)client);
X }
X
X if (pApp!=NullApp) {
X pXInfo= (XAppInfoPtr)appGetOutputPriv(pApp);
X if (pXInfo==NullXAppInfo) {
X uInternalError("NULL X info in xraClientResized\n");
X uVOIDRETURN;
X }
X if (client!=pXInfo->client) { /* don't do WM top level windows */
X uVOIDRETURN;
X }
X
X pState= pXInfo->pRealState;
X asValues(pState,(WinState *)NULL,NULL,NULL,&oldW,&oldH);
X if ((oldW!=newW)||(oldH!=newH)) {
X asChangeSelected(pState,asWidthValue|asHeightValue,asWithdrawn,0,0,
X newW,newH);
X uDEBUG4(WATCH_EVENTS,"App %s (%x,%x) changed:\n %s [w,h,config]\n",
X appText(pApp),pXInfo->parent,client,
X asText(pState));
X if (WantsWidth(pXInfo,newW)&&WantsHeight(pXInfo,newH)) {
X GotWidth(pXInfo);
X GotHeight(pXInfo);
X realChange= False;
X }
X else realChange= True;
X }
X else realChange= False;
X
X if (realChange) {
X uDEBUG(WATCH_EVENTS," Looks like a real change\n");
X (void)AppStateChanged(pApp,pState);
X }
X else {
X uDEBUG(WATCH_EVENTS," I was looking for this event\n");
X }
X }
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xvoid
XxraClientMoved(client,newX,newY)
XWindow client;
Xint newX,newY;
X{
XAppPtr pApp;
XXAppInfoPtr pXInfo;
XAppStatePtr pState;
X
X uENTRY3("xraClientMoved(0x%x,%d,%d)\n",client,newX,newY);
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)client);
X if (pApp==NullApp) {
X xraAddApp(client);
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)client);
X }
X if (pApp!=NullApp) {
X int oldX,oldY;
X
X uDEBUG1(WATCH_EVENTS,"Got a client move for app %s\n",appText(pApp));
X pXInfo= (XAppInfoPtr)appGetOutputPriv(pApp);
X if (pXInfo==NullXAppInfo) {
X uInternalError("NULL X info or geom in ClientMoved\n");
X uVOIDRETURN;
X }
X if (client!=pXInfo->client) {
X uVOIDRETURN;
X }
X pState= pXInfo->pRealState;
X asValues(pState,(WinState *)NULL,&oldX,&oldY,NULL,NULL);
X if ((oldX!=newX)||(oldY!=newY)) {
X asChangeSelected(pState,asXValue|asYValue,asInactive,
X newX,newY,(unsigned)0,(unsigned)0);
X uDEBUG4(WATCH_EVENTS,"App %s (%x,%x) changed:\n (%s) [x,y,msg]\n",
X appText(pApp),
X pXInfo->parent,pXInfo->client,
X asText(pState));
X }
X if (WantsX(pXInfo,newX)&&WantsY(pXInfo,newY)) {
X GotX(pXInfo);
X GotY(pXInfo);
X uDEBUG(WATCH_EVENTS," I was looking for this event\n");
X }
X else {
X uDEBUG(WATCH_EVENTS," Looks like a real event\n");
X AppStateChanged(pApp,pState);
X }
X }
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xvoid
XxraClientDestroyed(client)
XWindow client;
X{
XAppPtr pApp;
XXAppInfoPtr pXInfo;
XWindow parent= None;
X
X uENTRY1("xraClientDestroyed(0x%x)\n",client);
X uDEBUG(WATCH_EVENTS,"Got a destroy client\n");
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)client);
X if (pApp!=NullApp) {
X pXInfo= (XAppInfoPtr)appGetOutputPriv(pApp);
X if (pXInfo!=NullXAppInfo) {
X parent= pXInfo->parent;
X (void)uFree((Opaque)pXInfo);
X }
X AppDeactivated(pApp);
X htRemove(xraXApps,(GenKey)client);
X htRemove(xraXApps,(GenKey)parent);
X }
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xvoid
XxraStateChanged(client)
XWindow client;
X{
XAppPtr pApp;
XWinState winState;
XAppStatePtr pState= NullAppState;
XXAppInfoPtr pXInfo;
XBoolean myRequest= False;
X
X uENTRY1("xraStateChanged(0x%x)\n",client);
X pApp= (AppPtr)htLookup(xraXApps,(GenKey)client);
X
X#ifdef PROPERTY_RACE_CONDITION
X if (pApp==NullApp) {
X uDEBUG1(WATCH_EVENTS,"Got a property notify for non-app 0x%x\n",client);
X xraAddApp(client);
X uVOIDRETURN;
X }
X#endif
X uDEBUG1(WATCH_EVENTS,"Got a state change for app %s\n",appText(pApp));
X if (pApp!=NullApp) {
X pXInfo= (XAppInfoPtr)appGetOutputPriv(pApp);
X if (client!=pXInfo->client) {
X uVOIDRETURN;
X }
X winState= xruGetState(client,False);
X if (WantsState(pXInfo,winState)) {
X GotState(pXInfo);
X uDEBUG(WATCH_EVENTS,"I was looking for this event\n");
X myRequest= True;
X }
X uDEBUG2(WATCH_APPS,"%s -> %s\n",appText(pApp),asWinStateText(winState));
X if ((winState==asInactive)||
X ((winState==asWithdrawn)&&(!xraManageWithdrawn))) {
X if (pXInfo!=NULL)
X uFree((Opaque)pXInfo);
X AppDeactivated(pApp);
X }
X else if (!myRequest) {
X int x,y,border_width, depth;
X unsigned width,height;
X Window winreturn;
X
X XGetGeometry(xroomsDpy, client, &winreturn, &x, &y, &width, &height,
X &border_width, &depth);
X XTranslateCoordinates(xroomsDpy,client,xroomsRealRoot,
X -border_width, -border_width,
X &x, &y, &winreturn);
X pState= pXInfo->pRealState;
X asChangeSelected(pState,asAllValues,winState,x,y,width,height);
X uDEBUG2(WATCH_APPS,"new state for %s is %s\n",appText(pApp),
X asText(pState));
X AppStateChanged(pApp,pState);
X }
X else if ( asWinState(pXInfo->pRealState)!=asWithdrawn) {
X asChangeSelected(pXInfo->pRealState,asWinStateValue,winState,
X 0,0,0,0);
X }
X }
X uVOIDRETURN;
X}
X
X/***====================================================================***/
X
Xvoid
XxraInit()
X{
X uENTRY("xraInit()\n");
X xraXApps= htCreate((unsigned)71,genIntegerKeyType,genPointerDataType);
X if (xraXApps==NullHashTable) {
X uFatalError("Couldn't create xraXApps\n");
X /* NOTREACHED */
X }
X uVOIDRETURN;
X}
END_OF_FILE
if test 20206 -ne `wc -c <'./xrooms/xrApp.c'`; then
echo shar: \"'./xrooms/xrApp.c'\" unpacked with wrong size!
fi
# end of './xrooms/xrApp.c'
fi
echo shar: End of archive 11 \(of 14\).
cp /dev/null ark11isdone
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