This is PigApp.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "PigApp.h" #import <libc.h> #import <string.h> #import <defaults/defaults.h> #import <appkit/Button.h> #import <appkit/Panel.h> #import <appkit/TextField.h> #import <dpsclient/dpsclient.h> #import <sys/types.h> #import <sys/vfs.h> @implementation PigApp static double perc=100.0; // update display to reflect current disk usage void showUsage(PigApp *self) { struct statfs fs; long used, availblks; char foo[16]; // A better implementation might look at the username passed // to us by loginwindow, find the corresponding home // directory, and derive the filesystem name from that. if (statfs("/Users", &fs)<0) { (void)NXRunAlertPanel("UNIX Error", "statfs /Users: %s", "OK", (char *)NULL, (char *)NULL, strerror(errno)); [self terminate:nil]; } // computations stolen from df (shh!) used = fs.f_blocks - fs.f_bfree; availblks = fs.f_bavail + used; perc=availblks == 0 ? 100.0 : (double)used / (double)availblks * 100.0; (void)sprintf(foo, fs.f_bavail*fs.f_bsize<104857600 ? "%6.3fMB free" : "%6.2fMB free", fs.f_bavail*fs.f_bsize/1048576.0); [self->oinkFree setTextGray:perc>=90.0 ? NX_WHITE : NX_DKGRAY]; [self->oinkFree setStringValue:foo]; (void)sprintf(foo, "%3.0f%%", perc); [self->oinkBar setFloatValue:(float)(perc/100.0)]; [self->oinkPercent setTextGray:perc>=90.0 ? NX_WHITE : NX_BLACK]; [self->oinkPercent setStringValue:foo]; } // called on a periodic basis void timedout(DPSTimedEntry tid, double now, PigApp *self) { static int loser; showUsage(self); // dismiss after some number of ticks if (++loser>=10) [self->OKButton perform:@selector(performClick:) with:nil afterDelay:1 cancelPrevious:NO]; } static DPSTimedEntry tid=(DPSTimedEntry)-1; - appDidInit:sender { showUsage(self); if (![self mainMenu]) { // if not running under Workspace // if usage is less than 60%, just go away if (perc<60.0) [self terminate:nil]; // this is IMPORTANT--loginwindow doesn't deactivate itself! (void)[self activateSelf:YES]; } [oinkWin center]; [oinkWin makeKeyAndOrderFront:nil]; // This causes the display to be updated every two seconds // (probably too frequent!) tid=DPSAddTimedEntry(2.0, (DPSTimedEntryProc)timedout, (void *)self, NX_MODALRESPTHRESHOLD+1); return self; } // clean up - appWillTerminate:sender { if (tid!=(DPSTimedEntry)-1) { DPSRemoveTimedEntry(tid); DPSFlush(); [oinkWin orderOut:nil]; } return self; } // UNDOCUMENTED: suppress app tile and remove main menu // [this is messaged before appDidInit:] - _replyToLaunch { if (NXGetDefaultValue("ApplicationKit", "MachLaunch")) [super _replyToLaunch]; // ignore the warnings this generates else [self setMainMenu:nil]; return self; } // delegate method to catch close button - windowWillClose:sender { [OKButton performClick:nil]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.