This is previewPuppet.m in view mode; [Download] [Up]
#import "Puppeteer.h" #import "WindowInfo.h" int waitForWindowCountToChange(id puppet, int currentWindowCount) /* * Wait for the application's window count to change. Timeout after 1 minute. * Return the new window count. */ { int i, newWindowCount; for (i=0; i<60; i++) { if ((newWindowCount = [puppet windowCount]) != currentWindowCount) break; sleep(1); } return newWindowCount; } preview(id puppet, char *fileName, BOOL landscape) { id speaker = [puppet appSpeaker], layoutPanel, printPanel, keyWindow; int msgDelivered, fileOpened, i, windowCount; NXRect frame; /* * Ask Preview to open the file. */ msgDelivered = [speaker openFile:fileName ok:&fileOpened]; if (msgDelivered != 0) { fprintf(stderr, "Could not send message to Preview, code = %d\n", msgDelivered); return; } if (fileOpened == NO) { fprintf(stderr, "Preview could not open %s\n", fileName); return; } /* * Make Preview the active application. This is required * because otherwise the Page Layout menu command is not enabled. */ [puppet postActivate:YES]; /* * Bring up the Page Layout panel by sending Preview a * cmd-P. Save the current window count. */ windowCount = [puppet windowCount]; [puppet postKeyCode:'P' window:NX_KEYWINDOW flags:NX_COMMANDMASK]; /* * Make sure Preview has processed that command. We do that by waiting until * one extra window has appeared. */ windowCount = waitForWindowCountToChange(puppet, windowCount); /* * Now we read the frame size of Preview's key window and check * that the size corresponds to that of the layout panel. This * is to check in case the Page Layout menu item was disabled * (eg if the file was .ps instead of .eps), in which case we * would be sending the mouse clicks to the wrong window. */ layoutPanel = [puppet keyWindow]; [layoutPanel getFrame:&frame]; if (frame.size.width == 306 && frame.size.height == 323) { /* * Select either portrait or landscape mode by clicking on the * appropriate button. */ [puppet postSingleClick:NX_KEYWINDOW flags:0 x:landscape?130.0:60.0 y:64.0]; /* * Now click the OK button. */ [puppet postSingleClick:NX_KEYWINDOW flags:0 x:260.0 y:20.0]; windowCount = waitForWindowCountToChange(puppet, windowCount); } /* * Do a cmd-p followed by return to print the file. */ [puppet postKeyCode:'p' window:NX_KEYWINDOW flags:NX_COMMANDMASK]; windowCount = waitForWindowCountToChange(puppet, windowCount); [puppet postKeyCode:'\r' window:NX_KEYWINDOW flags:0]; /* * Wait for Preview to finish with the print panel. */ windowCount = waitForWindowCountToChange(puppet, windowCount); /* * And finally, get rid of the current window with a cmd-w. */ [puppet postKeyCode:'w' window:NX_KEYWINDOW flags:NX_COMMANDMASK]; } main(argc, argv) int argc; char **argv; { int c, errflg = 0; BOOL landscape = NO; id puppet, speaker; DPSContext ctxt; extern int optind; extern char *optarg; while ((c = getopt(argc, argv, "l")) != EOF) switch (c) { case 'l': landscape = YES; break; case '?': default: errflg++; break; } if (errflg) { fprintf(stderr, "Usage: previewPuppet [-l] file1.eps [file2.eps ...]\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 Preview puppet, launching Preview if necessary. */ puppet = [Puppeteer connectToApp:"Preview" launch:YES]; if (!puppet) { fprintf(stderr, "Could not connect to Preview\n"); exit(1); } /* * Attach the strings. Preview will then be ready to accept events. */ [puppet attachStrings]; /* * Now call Preview to print each file in turn. */ for (; optind < argc; optind++) { preview(puppet, argv[optind], landscape); } /* * Release strings. This is necessary for Preview 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.