NEXTSTEP 3.3 COMPATIBLE VERSION -- NOT FOR USE WITH EARLIER RELEASES!

SpaceSaver recasts the BackSpace application to be a *.loginbundle for use with loginwindow.app -- this allows existing BackSpace modules to act as screen savers when a NeXT is logged out.

This recast of BackSpace into a screen saver login bundle for use when no one is logged in was done by Christopher_Lane@Med.Stanford.EDU, in December 1993 and modified to work with NEXTSTEP 3.3 in February 1995.

The original BackSpace application was done by Sam Streeper of NeXT, with contributions from Bill Bumgarner, Lennart Lovstrand, Bruce Blumberg, shou-h@nexus.or.jp and others.

Undocumented NEXTSTEP 3.3 *.loginbundle details obtained via 'otool'.

This bundle was implemented and tested under the NEXTSTEP 3.3 release and is not compatible with earlier releases.  (There is a NEXTSTEP 3.2 compatible version of SpaceSaver on ftp://camis.stanford.edu/pub/NeXT/SpaceSaver_3.2.tar.gz)  This should be considered beta software--there may still be bugs & features to be sorted out.  (If you're at all squeamish about autonomous processes run by root with potential bugs, you might want to carefully consider before installing this!)

Installation

To install, as root, change to the SpaceSaver directory and do:

	> make install

Or, you can copy the MAB (m68k & i486) SpaceSaver.loginbundle from the original distribution file.  (Make sure to use the make command above if you remake from scratch so it will get stripped and take up less space.)  By default, the SpaceSaver Makefile will install into /usr/lib/NextStep/loginwindow.app but you can install it anywhere that's reasonable.

Then, as root, run the Preferences application and choose the Loginwindow icon.
Set the 'Custom Screen Saver' field to be the location where you installed the SpaceSaver.loginbundle.  (Warning, the 'Set..' button is buggy and will drop out components of directory paths so it's better to enter this manually.)

Finally, logout and type exit to the login window to restart the window server and invoke the newly installed SpaceSaver.

BackSpace module defaults & SpaceSaver

SpaceSaver uses BackSpace's imageFile, viewType & priority defaults, as set from BackSpace.app, and ignores the rest.  Thus, if set by root when using the BackSpace application, they should also affect SpaceSaver's behavior.  If you don't set BackSpace to a specific viewType, then All will be used and SpaceSaver will randomly choose a BackSpace module to display.

Additionally, any BackSpace module defaults that are set by root should take affect when the same module is invoked by SpaceSaver.  (How this is done is described below.)  So root should use some care when setting up BackSpace module preferences as they will affect the system's screen saver.

Some of root's changes to preferences in BackSpace won't take effect in SpaceSaver until you restart the window server.  You might want to consider removing root's existing BackSpace defaults and start over when you install SpaceSaver by doing:

	> dread -o BackSpace | dremove

Also, at the same time that you install SpaceSaver, as root you might want to set loginwindow's TimeToDim default to something shorter, for example 20 seconds:

	> dwrite loginwindow TimeToDim 20

SpaceSaver includes a default called ViewDirectory which is looked up under owner BackSpace.  This default lets you set an alternate directory to search for loadable BackSpace modules.  (For example, you could set the ViewDirectory to the SpaceSaver.loginbundle itself, and make symbolic links to modules in /LocalLibrary/BackSpaceViews that you think make for really good screen savers, ignoring the rest.)  If you have a /LocalLibrary/BackSpaceViews directory, you don't have to set this.

Known problems with existing BackSpace modules

I've tested the SpaceSaver bundle with over fifty BackSpace modules to make it compatible as possible but there are bound to be problems since it's not identical to the BackSpace application.  Assuming you've kept your collection of BackSpace modules reasonably up to date, there should be minimal compatibility issues.

Some known problems:

· BoinkSpace -- Since SpaceSaver doesn't incorporate BackSpace's Boink class this module doesn't load.  Since this is a load failure, SpaceSaver will detect it and move on to the next module so you can leave this one with the others. 

· StarShip -- This module includes a redundant definition of the nonretainedFillMethods category that keeps it from loading in some situations.  (Which I don't fully understand as sometimes BackSpace can load it.)  Since this is a load failure, SpaceSaver will detect it and move on to the next module so you can leave this one with the others.

· TeaPot -- I'm not sure it works when you're logged out as of this writing.  (It loads but you just end up with a black screen -- works fine in debug mode!)

· Toasters -- If you were lucky enough to get a legitimate copy of this before it was yanked from the archives long ago, it won't work with SpaceSaver unless you copy its *.tiff files into /usr/lib/NextStep/loginwindow.app and make sure that its *.BackO file (or *.BackModule directory) is on /LocalLibrary/BackSpaceViews.

Not a problem, but anything that returns YES to the isBoringScreenSaver query (e.g GradientView) will be skipped over.  Also modules that live in the Backspace application directory will need to migrate to /LocalLibrary/BackSpaceViews.

Internally patched BackSpace modules

The following work because of specific patches added to the SpaceSaver code, but may not in future releases if these patches are dropped:

· IconMosaicView -- (One of my own!) Older versions of this module (and other modules?) assume that the invoking object is the applications delegate.  (Use BSThinker() instead.)  The ScreenSaver class becomes the application's delegate while modules are running to satisfy this expectation.

· MovieShow -- SpaceSaver incorporates some alternate defaults settings so that this module does something useful (single image animation that floats around the screen) if uninitialized rather than putting up an alert panel.

· Multi -- Two patches, one to its defaults so that it does something useful (single Space view) if uninitialized.  The other patch is that since MultiView mucks directly with the Thinker class's instance variables, SpaceSaver's instance variables currently match those of the Thinker class even though many variables are not used.  The MultiView and MartinView modules also rely on the SpaceSaver patch that loads the module's inspector even though it isn't used.

· Spew -- This BackSpace module fails to load in some circumstances (even in BackSpace) due to the fmod() function getting inlined in the BackSpace and/or SpaceSaver code but still being a function call in Spew.  SpaceSaver includes a bogus call to fmod() and an extra compiler flag to make sure the routine exists.  This appears to be tied up with release 3.2 and g++ header files.

Differences from BackSpace.app

Although derived from the BackSpace source code, this ScreenSaver bundle is a lighter weight subset with many design deviations.  Hopefully, most of these will be invisible to BackSpace modules:

· SpaceSaver only looks in one directory, /LocalLibrary/BackSpaceViews by default, for loadable modules.  The original BackSpace application looks there, in its own *.app directory and in ~/Library/BackSpaceViews in the user's home directory.  You can, however, change the directory that SpaceSaver searches.  See the defaults descriptions above.

· SpaceSaver doesn't use inspectors.  It will invoke the inspector: method as some views use this to initialize themselves but it will never install or deinstall an inspector panel.  The various inspector query routines will return nil or are non-existent.

· SpaceSaver doesn't include the BoinkView class.  (Someone will need to extract this as a standalone BackSpace module for SpaceSaver to use it.)  Without this class, the BoinkSpace module doesn't work.  (However, this will fail on load and SpaceSaver will detect it and move to the next module.)

· SpaceSaver doesn't support BackSpace modules that take mouse input -- any mouse action will cancel the screen saver and return to the login window.  For all the modules I tested, this doesn't appear to be a problem.

· SpaceSaver doesn't implement hot corners.  If you want the screen saver to invoke sooner, as root set the TimeToDim default to a smaller value.

· SpaceSaver calls 'dread -o BackSpace' on first invocation to copy BackSpace's defaults into the current cache for loginwindow.  It skips any that loginwindow already has a value for.  This is done so that the module will find defaults that root set when running BackSpace.app.  If it didn't do this, root would have to manually copy all the defaults from BackSpace to loginwindow.  This may be a source of potential bugs and thus it's important that root keep it's BackSpace defaults relatively vanilla.  (I tried solving this by changing appName on the fly but that has its own bugs/concerns.)

· SpaceSaver only operates as a screen saver so there is no concept of normal or background mode in it's source code.  There is no ScreenLocker mode.

· SpaceSaver doesn't incorporate the autodim logic of BackSpace as it isn't clear whether this is currently valid in the loginwindow/ScreenSaver setup.

· Although SpaceSaver includes the BlackView & BackView classes for other modules to inherit from, it doesn't use BlackView or BackView.  The BackWindow  class is neither used in SpaceSaver nor included in the compilation.

· SpaceSaver doesn't invoke or use the windowTitle method.

· Unlike the Thinker class, the SpaceSaver class doesn't perform any of the duties of an application delegate.  However, it becomes the NXApp's delegate when modules are running since some assume that they are being invoked by such a delegate.

Differences for NEXTSTEP 3.3

· The step, startScreenSaver and stopScreenSaver methods have been renamed oneStep, didStartScreenSaver and didStopScreenSaver  for 3.3 compatibility.

· The DPSTimedEntry that periodically invoked (a potentially wedged) SpaceSaver has been dropped.

· The static paths to the default *.tiff & *.anim files in the SpaceSaver bundle are computed at runtime so SpaceSaver.loginbundle can live outside of loginwindow.app

· Changed SpaceSaver's oneStep method to be a one-to-one mapping to the BackSpace module's oneStep method.  This change may cost some animation speed/smoothness but should make SpaceSaver a better behaved object.

· Reworked SpaceSaver's thread priority logic so that it correctly resets the existing priority when the screen saver exits.  Thanks to Robert Lutwak <robert@amo.mit.edu> for pointing out this bug.