This is InfoMgr.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import <libc.h> #import <sys/time.h> #import <appkit/Application.h> #import <appkit/View.h> #import <appkit/NXImage.h> #import <appkit/Panel.h> #import <soundkit/Sound.h> #import "InfoMgr.h" void blinkTimerProc ( DPSTimedEntry teNumber, double now, char *userData ) { [ (id) userData blink ] ; return ; } @implementation InfoMgr - init { standardIcon = [ NXImage findImageNamed: "Sentinel" ] ; fuzzIcons [ 0 ] = [ NXImage findImageNamed: "Fuzz1" ] ; fuzzIcons [ 1 ] = [ NXImage findImageNamed: "Fuzz2" ] ; fuzzIcons [ 2 ] = [ NXImage findImageNamed: "Fuzz3" ] ; blinkIcons [ 0 ] = [ NXImage findImageNamed: "Blink1" ] ; blinkIcons [ 1 ] = [ NXImage findImageNamed: "Blink2" ] ; staticSound = [ Sound findSoundFor: "Static.snd" ] ; return [ super init ] ; } - openInfo: sender { int animationCounter ; long milTimer ; struct timeval tp ; struct timezone tzp ; if ( isInfoOpen ) { return self ; } [ infoIcon setFlipped: NO ] ; [ infoPanel makeKeyAndOrderFront: self ] ; [ staticSound play ] ; gettimeofday ( &tp,& tzp ) ; milTimer = tp.tv_usec ; for ( animationCounter = 0 ; animationCounter < 100 ; animationCounter++ ) { while ( ( tp.tv_usec >= milTimer ) && ( tp.tv_usec < milTimer + 5000 ) ) { gettimeofday ( &tp, &tzp ) ; } milTimer = tp.tv_usec ; [ self drawIcon: fuzzIcons [ animationCounter % 3 ] ] ; } [ self drawIcon: blinkIcons [ 0 ] ] ; blinkEntry = DPSAddTimedEntry ( 0.5, (DPSTimedEntryProc) blinkTimerProc, (void *) self, NX_MODALRESPTHRESHOLD ) ; isInfoOpen = YES ; return self ; } - windowWillClose: sender { int animationCounter ; long milTimer ; struct timeval tp ; struct timezone tzp ; isInfoOpen = NO ; DPSRemoveTimedEntry ( blinkEntry ) ; [ staticSound play ] ; gettimeofday ( &tp, &tzp ) ; milTimer = tp.tv_usec ; for ( animationCounter = 0 ; animationCounter < 100 ; animationCounter++ ) { while ( ( tp.tv_usec >= milTimer ) && ( tp.tv_usec < milTimer + 5000 ) ) { gettimeofday ( &tp, &tzp ) ; } milTimer = tp.tv_usec ; [ self drawIcon: fuzzIcons [ animationCounter % 3 ] ] ; } [ self drawIcon: standardIcon ] ; [ infoPanel orderOut: self ] ; return self ; } - blink { [ self drawIcon: blinkIcons [ random ( ) % 8 ? 0 : 1 ] ] ; return self ; } - drawIcon: (id) theIcon { NXPoint thePoint = { 8, 8 } ; [ [ [ NXApp appIcon ] contentView ] lockFocus ] ; [ theIcon composite: NX_SOVER toPoint: &thePoint ] ; [ [ [ NXApp appIcon ] contentView ] unlockFocus ] ; [ [ NXApp appIcon ] flushWindow ] ; [ infoIcon lockFocus ] ; [ theIcon composite: NX_SOVER toPoint: &thePoint ] ; [ infoIcon unlockFocus ] ; [ [ infoIcon window ] flushWindow ] ; return self ; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.