This is Menu.m in view mode; [Download] [Up]
/* File: Menu.m - (Interactive) Unix shell version of Menu
*
* By: Christopher Lane (lane@sumex-aim.stanford.edu)
*
* Date: 10 November 1992
*
* Modified:
* [17-Feb-96 TRH] Fix for Application option munching (like -NXHost).
* [12-Mar-96 TRH] add -V -H -A options; add EditMenu keyEquiv support.
*
* Copyright: 1990, 1991 & 1992 by The Leland Stanford Junior University.
* This program may be distributed without restriction for non-commercial use.
*/
#import "ShellPanel.h"
#define SELECTOR @selector(stop:)
#define KEYCODE '1'
#define TIMEOUT 30
#define USAGE "\
usage: %s [-c char] [-t title] [-x xpos -y ypos] [-T seconds] [-V] [-H] item [item [...]]\n"
#define HELP "\
options:\n\
-c char set first key equivalent\n\
-t title set title (default none)\n\
-x xpos\n\
-y ypos set origin of window, in screen coordinates.\n\
-T seconds timeout in seconds, 0 means wait indefinitely (default "STRINGIZE(TIMEOUT)")\n\
-V print version string and exit\n\
-H this help\n\
"
@interface MenuApp : Application { }
- appDidInit:sender;
@end
@implementation MenuApp : Application
- appDidInit:sender
{
[[self appIcon] orderOut:self];
return self;
}
@end
void timer(DPSTimedEntry teNumber, double now, int status) { exit(status); }
void main(int argc, char *argv[])
{
const char *title = NULL;
double timeout = TIMEOUT;
unsigned short keyCode = KEYCODE;
int option, status = EXIT_SUCCESS;
NXPoint point = { -1.0, -1.0 };
DPSTimedEntry teNumber = NULL;
NXApp = [MenuApp new];
argc = NXArgc, argv = NXArgv; // Application may munch options.
while ((option = getopt(argc, argv, "c:t:x:y:T:VH")) != EOF)
switch (option) {
case 'c': keyCode = optarg[0]; break;
case 't': title = optarg; break;
case 'x': point.x = atof(optarg); break;
case 'y': point.y = atof(optarg); break;
case 'T': timeout = atol(optarg); break;
case 'V': status = EXIT_VERSION; break;
case 'H': status = EXIT_HELP; break;
default : status = EXIT_USAGE;
}
if (status == EXIT_SUCCESS && optind == argc) status = EXIT_USAGE;
HandleUsageHelpVersion(status, USAGE, HELP);
{
int context = [NXApp activateSelf:YES];
id menu = [Menu newTitle:(title == NULL) ? [NXApp appName] : title];
//[TRH} This does not work in 3.2, move to beyond setMainMenu:
//if(point.x >= 0.0 && point.y >= 0.0) [menu moveTopLeftTo:point.x :point.y];
for(option = optind; option < argc; option++)
[[menu addItem:argv[option] action:SELECTOR keyEquivalent:keyCode++] setTarget:NXApp];
[NXApp setMainMenu:menu];
//[TRH] moved to beyond setMainMenu in the hope it works.
if(point.x >= 0.0 && point.y >= 0.0) [menu moveTopLeftTo:point.x :point.y];
if(timeout) teNumber = DPSAddTimedEntry(timeout, (DPSTimedEntryProc) &timer, (void *) EXIT_FAILURE, NX_BASETHRESHOLD);
[NXApp run];
if(timeout) DPSRemoveTimedEntry(teNumber);
(void) printf("%s\n", [[[menu itemList] selectedCell] title]);
if(context) (void) [NXApp activate:context];
}
[NXApp free];
exit(status);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.