This is TopControl.m in view mode; [Download] [Up]
#import "TopControl.h" #import "ScaledView.h" #import <dpsclient/dpsclient.h> #import <appkit/Application.h> #import <appkit/Window.h> #import <appkit/graphics.h> #import <appkit/NXBitmapImageRep.h> #import <appkit/OpenPanel.h> @implementation TopControl - appDidInit:sender { NXRect frame; [[window contentView] getFrame:&frame]; frame.origin.x=0.0; frame.origin.y=0.0; // currently hardwired to ScaledView. Simply add whatever // view you want to the project and grab a new instance here. Everything // should work just dandy after that. view1=[[ScaledView alloc] initFrame:&frame]; [view1 setAutosizing:NX_WIDTHSIZABLE | NX_HEIGHTSIZABLE]; [[window contentView] addSubview:view1]; [window useOptimizedDrawing:YES]; [window setBackgroundGray:NX_BLACK]; return self; } - doIE { NXEvent dummyEvent, *evnt; [infoView lockFocus]; do { [infoView oneStep]; [infoView oneStep]; // do two steps evnt=[NXApp peekNextEvent:NX_ALLEVENTS into:&dummyEvent waitFor:0 threshold:NX_BASETHRESHOLD]; } while(infoRun && !evnt); [infoView unlockFocus]; return self; } void itehandler(DPSTimedEntry te, double time, void *tobj) { [(id)tobj doIE]; } - infoPanel:sender { [infoPanel makeKeyAndOrderFront:self]; if(!infoRun){ ientry=DPSAddTimedEntry(0.02, &itehandler, self, NX_BASETHRESHOLD); infoRun=YES; } return self; } - windowWillClose:sender { if (sender==infoPanel) { infoRun=NO; DPSRemoveTimedEntry(ientry); } return self; } - doTE { NXEvent dummyEvent, *evnt; NXEvent *theEvent, nextEvent; char bname[50], name[100]; NXBitmapImageRep *theRep; NXStream *theStream; NXRect theRect; int count=0; BOOL advancedCommandSet=[view1 advancedCommandSet]; sprintf(bname,"/tmp/%s", [view1 name]); [view1 lockFocus]; do { [view1 oneStep]; [view1 oneStep]; // do two steps // this if statement basically does some advanced sort of stuff if the // view supports it. It currently isn''t documented, but will be in the // future. Check out FooFaraw.m and ScaledView.m for a view that supports // such goofiness... if(advancedCommandSet && [NXApp peekNextEvent:NX_FLAGSCHANGEDMASK into:&nextEvent]){ theEvent=[NXApp getNextEvent:NX_FLAGSCHANGEDMASK]; if(theEvent->flags & NX_COMMANDMASK) { if([view1 respondsTo:@selector(commandKey)]){ [view1 commandKey]; } } else if(theEvent->flags & NX_ALTERNATEMASK) { [view1 getBounds:&theRect]; theRep = [[NXBitmapImageRep alloc] initData:NULL fromRect:&theRect]; sprintf(name, "%s.%d.tiff", bname, count++); fprintf(stdout, "BackSpace (%s) Saving: %s\n", [view1 name], name); theStream=NXOpenMemory(NULL, 0, NX_WRITEONLY); if(theStream) { [theRep writeTIFF:theStream]; if(NXSaveToFile(theStream, name) != 0) { fprintf(stderr, "FooFaraw:save failed!\n"); } NXClose(theStream); } else { fprintf(stderr, "FooFaraw: could not save!\n"); } [theRep free]; } } evnt=[NXApp peekNextEvent:NX_ALLEVENTS into:&dummyEvent waitFor:0 threshold:NX_BASETHRESHOLD]; } while(running && !evnt); [view1 unlockFocus]; return self; } void tehandler(DPSTimedEntry te, double time, void *tobj) { [(id)tobj doTE]; } - runStop:sender { if(!running){ // add the timed entry tentry=DPSAddTimedEntry(0.02, &tehandler, self, NX_BASETHRESHOLD); running=YES; } else { running=NO; DPSRemoveTimedEntry(tentry); } return self; /* [view1 lockFocus]; for(i=0;i<1000;i++) [view1 oneStep]; [view1 unlockFocus]; */ } - open:sender { return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.