|
|
1.1 ! root 1: // BackView.m ! 2: // ! 3: // a View that provides some functionality that some screen savers might ! 4: // find useful; you can subclass this class if you like. ! 5: // ! 6: // You may freely copy, distribute, and reuse the code in this example. ! 7: // NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 8: // fitness for any particular use. ! 9: ! 10: #import "BackView.h" ! 11: #import "Thinker.h" ! 12: #import <appkit/NXImage.h> ! 13: #import <dpsclient/wraps.h> ! 14: #import <libc.h> ! 15: ! 16: @implementation BackView ! 17: ! 18: - (BOOL) timePassed: (BStimeval) delay ! 19: { ! 20: BStimeval now, msec; ! 21: BOOL result; ! 22: ! 23: now = currentTimeInMs(); ! 24: if (BVthen == 0) // added by [email protected] ! 25: BVthen = now; // added by [email protected] ! 26: msec = now - BVthen; ! 27: ! 28: //so as not to suck too many cycles, if I'm waiting for some ! 29: // time more than a tenth of a second in the future, I sleep ! 30: // a while. This interval is short enough that the app shouldn't ! 31: // seem unresponsive to user actions. ! 32: ! 33: // ok, so you'd never pull this trick if the user had to type. ! 34: // A better solution would be to coordinate the timed entry better, ! 35: // but I get slightly better performance from spinning in my ! 36: // timed entry (a bad idea for most apps...) ! 37: ! 38: if ((msec + 120) < delay) ! 39: { usleep(110000); ! 40: return NO; ! 41: } ! 42: ! 43: result = (msec > delay); ! 44: if (result) BVthen = now; ! 45: ! 46: return result; ! 47: } ! 48: ! 49: - initFrame:(const NXRect *)frameRect ! 50: { ! 51: [super initFrame:frameRect]; ! 52: [self allocateGState]; // For faster lock/unlockFocus ! 53: ! 54: srandom(time(0)); ! 55: ! 56: [self setImageConstraints]; ! 57: return self; ! 58: } ! 59: ! 60: - sizeTo:(NXCoord)width :(NXCoord)height ! 61: { ! 62: [super sizeTo:width :height]; ! 63: [self setImageConstraints]; ! 64: return self; ! 65: } ! 66: ! 67: - drawSelf:(const NXRect *)rects :(int)rectCount ! 68: { ! 69: if (!rects || !rectCount) return self; ! 70: ! 71: PSsetgray(0); ! 72: NXRectFill(rects); ! 73: ! 74: return self; ! 75: } ! 76: ! 77: - setImageConstraints ! 78: { ! 79: maxCoord.x = bounds.size.width - imageRect.size.width; ! 80: maxCoord.y = bounds.size.height - imageRect.size.height; ! 81: if (maxCoord.x < 0) maxCoord.x = 0; ! 82: if (maxCoord.y < 0) maxCoord.y = 0; ! 83: ! 84: return self; ! 85: } ! 86: ! 87: ! 88: - setImage: newImage ! 89: { ! 90: image = newImage; ! 91: [image getSize: &imageRect.size]; ! 92: ! 93: [self setImageConstraints]; ! 94: [self display]; ! 95: ! 96: return self; ! 97: } ! 98: ! 99: - (BOOL) useBufferedWindow ! 100: { ! 101: return YES; // by default; can be overridden in subclasses ! 102: } ! 103: ! 104: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.