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

/* FortuneApp.m
 * Version 1.0
 * Chris Saldanha, April 1996
 * Class to display fortunes in a simple window.
 * Can copy the fortune into the ASCII pasteboard from a menu option.
 * Clicking in the window's content view makes it go away.

#import "FortuneApp.h" 
#import "MiscAppDefaults.h"
#import "FortuneText.h"

@implementation FortuneApp

- printFortune
FILE *myPipe;
NXScreen *myScreen;
NXRect graphicsRect;
NXStream *fortuneStream;
char str[100];
struct stat buf;

/* Make the Text as wide as the screen to start with. */
(const NXScreen *)myScreen = [myWindow screen];
NXSetRect(&graphicsRect, 0.0, 0.0, myScreen->screenBounds.size.width, 10.0);
[myText sizeTo: graphicsRect.size.width : graphicsRect.size.height];

if (stat(programLocation, &buf) == -1)
	sprintf(str, "%s: %s", programLocation, strerror(errno));
	NXRunAlertPanel("Un-Fortunate Error", str, "OK", NULL, NULL);
	[self terminate:nil];
myPipe = popen(programLocation, "r");
if (myPipe != NULL)
	fortuneStream = NXOpenFile(fileno(myPipe), NX_READONLY);
	[myText readText: fortuneStream];
	NXRunAlertPanel("Un-Fortunate Error", "Could not open pipe!", "OK", NULL, NULL);

[myText sizeToFit];
[myText getFrame: &graphicsRect];
[myWindow sizeWindow: graphicsRect.size.width : graphicsRect.size.height];
[myWindow center];			/* stupid American misspelling :-# */
[myWindow display];

[myWindow setContentView:myText];
[myWindow makeKeyAndOrderFront:nil];
[myText display];
return self;

- anotherFortune:sender
[myWindow close];
[self printFortune];
return self;

- copyFortune: sender
Pasteboard *pboard = [Pasteboard new];

[pboard declareTypes: &NXAsciiPboardType num: 1 owner:self];
[pboard writeType: NXAsciiPboardType fromStream: [myText stream]];
return self;

- mouseDown:(NXEvent *)theEvent
[self terminate: nil];
return self;

struct stat buf;
int fontSize;
char *fontName;
NXRect graphicsRect;
NXSetRect(&graphicsRect, 0.0, 0.0, 10.0, 10.0);

(const char *)programLocation = [self defaultValue: "FortuneLocation"];
if (programLocation == NULL)
	[self setDefault: "FortuneLocation" to: "/usr/games/fortune"];
	programLocation = calloc(19, sizeof(char));
	strcpy(programLocation, "/usr/games/fortune");
if (stat(programLocation, &buf) == -1)
	NXRunAlertPanel("Un-Fortunate Error", "Fortune program does not exist!", "OK", NULL, NULL);
(const char *)fontName = [self defaultValue: "FontName"];
if (fontName == NULL)
	[self setDefault: "FontName" to: "Courier-Oblique"];
	fontName = calloc(16, sizeof(char));
	strcpy(fontName, "Courier-Oblique");
fontSize = [self defaultIntValue: "FontSize"];
if (fontSize < 1)
	[self setDefault: "FontSize" toInt: 14];
	fontSize = 14;

myWindow = [[Window alloc] 
				initContent: &graphicsRect
				backing: NX_BUFFERED
				buttonMask: 0
				defer: NO];
[myWindow setTitle:"Fortune"];
[myWindow setFreeWhenClosed: NO];

myText = [[Text alloc] initFrame: &graphicsRect
						text: ""
						alignment: NX_LEFTALIGNED];
[myText setBackgroundGray: NX_LTGRAY];
[myText setEditable: NO];
[myText setSelectable: NO];
[myText setVertResizable: YES];
[myText setFont: [Font newFont: fontName size: fontSize]];

myMenu = [[Menu alloc] initTitle: "Fortunate"];
[myMenu addItem: "Another Fortune..." 
		action: @selector(anotherFortune:)
		keyEquivalent: 'a'];
[myMenu addItem: "Copy Fortune" 
		action: @selector(copyFortune:)
		keyEquivalent: 'c'];
[myMenu addItem: "Quit" 
		action: @selector(terminate:)
		keyEquivalent: 'q'];
[myMenu sizeToFit];
[NXApp setMainMenu:myMenu];

return self;

[myWindow close];
[myWindow free];
return [super terminate: sender];


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