This is websterPuppet.m in view mode; [Download] [Up]
#import "Puppeteer.h"
void
define(id puppet, char *word)
{
id speaker = [puppet appSpeaker], pb;
int msgDelivered, fileOpened, length;
char *data;
/*
* Unhide Webster. Things don't work properly if the target application is
* hidden.
*/
[speaker selectorRPC:"unhide" paramTypes:""];
/*
* Make Webster the active application.
*/
[puppet postActivate:YES];
/*
* Ask Webster to define the word.
*/
msgDelivered = [speaker openFile:word ok:&fileOpened];
if (msgDelivered != 0) {
fprintf(stderr, "Could not send message to Webster, code = %d\n",
msgDelivered);
return;
}
if (fileOpened == NO) {
fprintf(stderr, "Webster could not open %s\n", word);
return;
}
/*
* Simulate a click in the lower scroll view.
*/
[puppet postSingleClick:NX_KEYWINDOW flags:0 x:40.0 y:40.0];
/*
* Now ask Webster to copy the definition to the pasteboard. This is done by
* cmd-a (select all) followed by cmd-c (copy).
*/
[puppet postKeyCode:'a' window:NX_KEYWINDOW flags:NX_COMMANDMASK];
[puppet postKeyCode:'c' window:NX_KEYWINDOW flags:NX_COMMANDMASK];
[puppet ping]; // Make sure requests have been processed.
/*
* Finally, read data from the pasteboard.
*/
pb = [Pasteboard new];
[pb types];
if ([pb readType:NXAsciiPboardType data:&data length:&length]) {
printf("%s", data);
[pb deallocatePasteboardData:data length:length];
} else
fprintf(stderr, "No data on pasteboard!\n");
}
void
main(argc, argv)
int argc;
char **argv;
{
int c, errflg = 0;
id puppet;
DPSContext ctxt;
extern int optind;
while ((c = getopt(argc, argv, "")) != EOF)
switch (c) {
case '?':
default:
errflg++;
break;
}
if (errflg || !argv[optind]) {
fprintf(stderr, "Usage: websterPuppet word\n");
exit(2);
}
/*
* Because the WindowInfo object sends postscript commands, we have to
* create a postscript context for it to run in.
*/
ctxt = DPSCreateContext(0, 0, NULL, NULL);
DPSSetContext(ctxt);
/*
* Create the Webster puppet, launching Webster if necessary.
*/
puppet = [Puppeteer connectToApp:"Webster" launch:YES];
if (!puppet) {
fprintf(stderr, "Could not connect to Webster\n");
exit(1);
}
/*
* Attach the strings. Webster will then be ready to accept events.
*/
[puppet attachStrings];
/*
* Now call Webster to define the word.
*/
define(puppet, argv[optind]);
/*
* Release strings. This is necessary for Webster to continue to respond to
* real user events.
*/
[puppet releaseStrings];
DPSDestroyContext(ctxt);
}These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.