ftp.nice.ch/pub/next/tools/screen/SpaceSaver.3.3.1.NIHS.bs.tar.gz#/SpaceSaver/Source/BackView.m

This is BackView.m in view mode; [Download] [Up]

// BackView.m
//
// a View that provides some functionality that some screen savers might
// find useful; you can subclass this class if you like.
//
// You may freely copy, distribute, and reuse the code in this example.
// NeXT disclaims any warranty of any kind, expressed or implied, as
// to its fitness for any particular use.

#import "BackView.h"
#import <appkit/NXImage.h>
#import <dpsclient/wraps.h>
#import <libc.h>

@implementation BackView

- initFrame:(const NXRect *) frameRect
{
	[super initFrame:frameRect];

	return [[self allocateGState] setImageConstraints];
}

- sizeTo:(NXCoord) width :(NXCoord) height
{
	[super sizeTo:width :height];

	return [self setImageConstraints];
}

- drawSelf:(const NXRect *) rects :(int) rectCount
{
	if (rects == NULL || rectCount == 0) return self;

	PSsetgray(NX_BLACK);
	NXRectFill(rects);

	return self;
}

- setImageConstraints
{
	maxCoord.x = bounds.size.width - imageRect.size.width;
	maxCoord.y = bounds.size.height - imageRect.size.height;

	if (maxCoord.x < 0) maxCoord.x = 0;
	if (maxCoord.y < 0) maxCoord.y = 0;

	return self;
}

- setImage: newImage
{
	[(image = newImage) getSize:&imageRect.size];

	return [[self setImageConstraints] display];
}

- (BOOL) useBufferedWindow
{
	return YES; // by default; can be overridden in subclasses
}

- (BOOL) timePassed:(BStimeval) delay
{
	BOOL result = NO;
	BStimeval msec, now = currentTimeInMs();

	if (BVthen == 0) BVthen = now; // added by shou-h@nexus.or.jp
	msec = now - BVthen;

	// so as not to suck too many cycles, if I'm waiting for some
	// time more than a tenth of a second in the future, I sleep
	// a while.  This interval is short enough that the app shouldn't
	// seem unresponsive to user actions.

	// ok, so you'd never pull this trick if the user had to type.
	// A better solution would be to coordinate the timed entry better,
	// but I get slightly better performance from spinning in my
	// timed entry (a bad idea for most apps...)

	if ((msec + 120) < delay) usleep(110000);
	else if (result = (msec > delay)) BVthen = now;

	return result;
}

@end

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