ftp.nice.ch/pub/next/tools/screen/backspace/Roaches.1.1.s.tar.gz#/Roaches/RoachesView.h

This is RoachesView.h in view mode; [Download] [Up]

/* RoachesView is Copyright 1994 by Brian Hill <bhill@physics.ucla.edu>. */

/*    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
    
*/

/* RoachesView.h:    RoachesView is a BackSpace module inspired by xroach.
 *                   
 *                   In particular, roaches should scurry under other 
 *                   application's windows when the light comes on 
 *                   (i.e. when the screensaver goes off).  For this 
 *                   behavior to be observable, the module must be 
 *                   run as a background as well as a screensaver.  
 *                   
 * General organization: Each Roach is responsible for its own animation and 
 * drawing (although the Roaches share an NXImage array).  The Roach has the 
 * id of the RoachesView, and it finds out whether a new position is ok 
 * (inside the window bounds and not to close to any other Roaches) and 
 * whether it is exposed by messaging the RoachesView.
 *
 * So that the Roaches can hide under the windows of other applications,
 * the RoachesView maintains a client side copy of NXRect's and window numbers
 * for all of the windows in the window server's screenlist.  Commands needed
 * to test whether a Roach is exposed do not exist on the server side, 
 * and even if they did, if they were as slow as findwindow, their execution
 * would bog down the animation.  positionExposed:: does the client side test.
 *
 * If the RoachesView is resized and a Roach finds itself out of bounds,
 * it is repositioned.  Thus going to smaller windows corrals the Roaches.
 * 
 * Conversely, going from a smaller window to a larger window, one will find
 * the Roaches initially clustered around the lower left part of the larger
 * window.
 *
 * 3/21/94 Alpha release. --Brian Hill <bhill@physics.ucla.edu>
 * 3/22/94 Makefile.postamble only worked in NS 3.2.  Inserted Jonathan
 *         Flynn's <jflynn@skippy.phys.soton.ac.uk> patch for NS 3.1 and 3.0.
 *  4/5/94 Preserved user's background color preference any time
 *         the RoachesView is not on top of the screenList (i.e., not
 *         serving as a screensaver).  Also, made roach color user-selectable
 *         Beta release.
 *  4/6/94 Changed to unbuffered windows.  Offscreen composition in NXImage to
 *         reduce flicker.  Changed drawing commands to user paths.  Coordinate
 *         transformations are now done on client side.  Still too slow :(
 *  4/7/94 Reduced number of possible Roach angles to RESOLUTION.  Introduced
 *         sharedImages array.
 *  4/8/94 Added PSsetexposurecolor() to work around window server's failure to
 *         promptly flush events that would trigger RoachesView drawSelf::.  
 *         Thanks Scott Hess <scott@nic.gac.edu>!
 * 4/11/94 Improved roach-roach avoidance.  Introduced imageClean flags.  Fixed
 *         compositing when user's background is textured.
 *         Release Version 1.0 multiple-architecture binary.
 * 4/12/94 Added Copyright notices so I feel more comfortable about
 *         e-mailing source to requestors.
 * 4/21/94 Overrode fillBoundsWithBlack to reduce flicker when first drawing in
 *         a full-screen window.  See SpaceView.m comment reproduced below.
 * 4/24/94 Finished Pacemaker and combined all update method
 *         PostScript code into a single wrap.  Background color bug fixed.
 *         RoachesView now cleans up exposure color by implementing 
 *         removeFromSuperview.
 *  7/9/94 Hacked Pacemaker doze method to try to isolate oversleeping bug.
 * 10/14/94 Announced tri-fat version.
 *
 * To do: 
 *
 * Optimize client side code.
 *
 * Set exposure color back to black before leaving background window, 
 * or other modules get the user's background color as their exposure color.
 * 
 * Improve "artwork."
 * 
 * Makefile.postamble is still less than satisfactory.  (My fault, not 
 * Jonathan's.)  Renaming of object module to .BackO extension shouldn't
 * wait until make install.  It should occur after make with no explicitly
 * listed target, and after make debug.
 *
 * Think about alternative times for checking things that shouldn't change too
 * often.  Currently all those checks are stuffed into drawSelf:: (which the
 * window server is not always logical about calling).
 */

#import <appkit/appkit.h>
#import "Pacemaker.h"

#ifdef DEBUG
/* #define TIMING */
#endif

/* Number of possible angles Roach can point in.  Defined here rather than
 * in Roach.h for use in sharedImages below. */
#define RESOLUTION 64
/* RESOLUTION affects Roach behavior.  See comment in Roach oneStep method. */

/* The following defines are only used in case the user doesn't have the
 * relevant defaults.  In any case, the nib's initial values (for the sliders
 * and the colorWell are irrelevant. */
#define SPEED_STRING "10"
#define NUMBER_STRING "10"
#define ROACH_RED (80.0f/256.0f) 
#define ROACH_GREEN (24.0f/256.0f) 
#define ROACH_BLUE (24.0f/256.0f)
#define COLORROACHCOLOR NXConvertRGBToColor(ROACH_RED, ROACH_GREEN, ROACH_BLUE)

typedef struct _windowRectangle {
  NXRect rectangle;
  int number;
  struct _windowRectangle *next;
} windowRectangle;

// The following protocol eliminates the need for the BackSpace's Thinker.h.

@protocol ThinkerProtocol
- (const char *)moduleDirectory:(const char *)name;
@end

@interface RoachesView:View
{
  id inspector;
  id roachList;
  id speedSlider;
  id numberSlider;
  id speedField;
  id numberField;
  id colorWell;
  id pacemaker;
  int speed, scaledSpeed;
  DPSContext ctxt;
  BOOL imageClean[RESOLUTION];
  NXImage *sharedImages[RESOLUTION];
  NXPoint roachesViewOffset;
  int currentWindowNumber;
  int next; /* The index in the screenlist of the of the next window 
	       rectangle to update. */
  windowRectangle *windowRectangles, *lastWindowRectangle;
  NXZone *roachZone;
  BOOL sizeInvalid;  /* RoachesView has been resized; reposition Roaches. */
  NXColor backgroundColor, roachesColor;
#ifdef TIMING
  NXStream *stderrStream;
  id timer0, timer1, timer2, timer10, timer11, timer12, timer3;
#endif
}

- takeSpeedFrom:sender;
- takeNumberFrom:sender;
- takeColorFrom:sender;
- (NXColor)backgroundColor;
- (float)scaledSpeed;
- initFrame:(const NXRect *)frameRect;
- readBackgroundColor;
- readRoachesColor;
- readRoachesSpeed;
- (unsigned)readRoachesNumber;
- (BOOL *)imageClean;
- (NXImage **)sharedImages;
- clearSharedImages;
- (BOOL)useBufferedWindow;
- addRoach;
- deleteRoach:roachGettingDeleted;
- free;
- oneStep;
- (BOOL)okPosition:(const NXPoint *)position :(NXCoord)size;
- (int)positionExposed:(const NXPoint *)position :(NXCoord)size;
- drawSelf:(const NXRect *)rects :(int)rectCount;
- removeFromSuperview;
- sizeTo:(NXCoord)width :(NXCoord)height;
- inspector:sender;
- (const char *)windowTitle;
- fillBoundsWithBlack;

@end

/* Comment from SpaceView.m: */

//@implementation View(nonretainedFillMethod)

// I add this method as a category of View to be sure that all
// my views implement it.  I really want to use nonretained windows
// but they are drawn via drawSelf at all kinds of goofy times.  It
// seems like the kit kind of throws up its hands when it doesn't have
// a buffer to draw from, so you get a lot more drawSelfs than you need,
// and sometimes you don't get them when you really want them.  I know
// when I need the background filled in black, so I factor that out of
// my drawSelf and then drawself only draws things that are already on
// screen so you don't see it happen.  I will only call this method on
// a nonretained (and full screen) window.

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.