home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (C) 1994 Marc Parmet.
- * This file is part of the Macintosh port of GNU Emacs.
- *
- * GNU Emacs is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- */
-
- /*
- to do:
- handle page range and copy count
- */
-
- #include <MacHeaders>
- #include <Printing.h>
-
- char quitting;
- char border_rect,print_format;
- MenuHandle apple_menu,file_menu;
-
- enum {
- apple_menu_about = 1,
-
- file_menu_page_setup = 1,
- file_menu_print,
- empty1,
- file_menu_quit
- };
-
- int
- have_required_params(AppleEvent *e)
- {
- short err;
- long actualSize;
- DescType returnedType;
-
- err = AEGetAttributePtr(e,keyMissedKeywordAttr,typeWildCard,
- &returnedType,0L,0,&actualSize);
-
- if (err == errAEDescNotFound)
- return 0;
- else if (err == 0)
- return errAEEventNotHandled;
- else
- return err;
- }
-
- pascal short
- do_ae_quit(AppleEvent *e,AppleEvent *reply,long refCon)
- {
- short err = have_required_params(e);
- if (err) return err;
- quitting = 1;
- return noErr;
- }
-
- pascal short
- do_ae_open_doc(AppleEvent *e,AppleEvent *reply,long refCon)
- {
- return errAEEventNotHandled;
- }
-
- pascal short
- do_ae_page_setup(AppleEvent *e,AppleEvent *reply,long refCon)
- {
- short err = have_required_params(e);
- if (err) return err;
- err = AEInteractWithUser(kAEDefaultTimeout,0L,0L);
- if (err) return err;
- do_page_setup();
- return noErr;
- }
-
- void
- reset_options(void)
- {
- border_rect = 0;
- print_format = 0;
- }
-
- pascal short
- do_ae_reset_options(AppleEvent *e,AppleEvent *reply,long refCon)
- {
- short err = have_required_params(e);
- if (err) return err;
- reset_options();
- return noErr;
- }
-
- pascal short
- do_ae_set_options(AppleEvent *e,AppleEvent *reply,long refCon)
- {
- Boolean k;
- short err;
- long actualSize;
- AEKeyword keywd;
- long i,itemsInList;
- AEDescList docList;
- unsigned char s[256];
- DescType returnedType;
-
- err = AEGetParamDesc(e,keyDirectObject,typeAEList,&docList);
- if (err) return err;
- err = have_required_params(e);
- if (err) return err;
- err = AECountItems(&docList,&itemsInList);
- if (err) return err;
- i = 1;
- while (i < itemsInList) {
- err = AEGetNthPtr(&docList,i++,typeChar,&keywd,&returnedType,s,
- sizeof(s),&actualSize);
- if (err) continue;
- s[actualSize] = '\0';
- if (!strcmp(s,"p")) {
- err = AEGetNthPtr(&docList,i++,typeBoolean,&keywd,&returnedType,&k,
- sizeof(k),&actualSize);
- if (err) continue;
- print_format = k;
- }
- else if (!strcmp(s,"R")) {
- err = AEGetNthPtr(&docList,i++,typeBoolean,&keywd,&returnedType,&k,
- sizeof(k),&actualSize);
- if (err) continue;
- border_rect = k;
- }
- }
-
- err = AEDisposeDesc(&docList);
- if (err) return err;
- return noErr;
- }
-
- pascal Boolean
- idle_function(EventRecord *event,long *sleepTime,RgnHandle *mouseRgn)
- {
- *sleepTime = 15;
- *mouseRgn = 0L;
-
- switch (event->what) {
- case nullEvent:
- case updateEvt:
- case activateEvt:
- case osEvt:
- // We never do anything for these events.
- break;
- }
-
- return 0;
- }
-
- pascal short
- do_ae_print_doc(AppleEvent *e,AppleEvent *reply,long refCon)
- {
- FSSpec fs;
- AEDescList docList;
- short err;
- long i,itemsInList;
- long actualSize;
- AEKeyword keywd;
- DescType returnedType;
-
- // If the sender specified kAEWaitReply and kAECanSwitchLayer, then
- // we return from this right away and go right to the print job dialog.
- err = AEInteractWithUser(kAEDefaultTimeout,0L,0L);
- if (err) return err;
-
- err = AEGetParamDesc(e,keyDirectObject,typeAEList,&docList);
- if (err) return err;
- err = have_required_params(e);
- if (err) return err;
- err = AECountItems(&docList,&itemsInList);
- if (err) return err;
- for (i = 1; i<=itemsInList; ++i) {
- err = AEGetNthPtr(&docList,i,typeFSS,&keywd,&returnedType,&fs,
- sizeof(FSSpec),&actualSize);
- if (err) continue;
- do_print_spec(&fs);
- }
-
- err = AEDisposeDesc(&docList);
- if (err) return err;
- return noErr;
- }
-
- pascal short
- do_ae_open_app(AppleEvent *e,AppleEvent *reply,long refCon)
- {
- short err = have_required_params(e);
- if (err) return err;
- return noErr;
- }
-
- main()
- {
- short err;
-
- MaxApplZone();
- InitGraf(&thePort);
- InitFonts();
- FlushEvents(everyEvent,0);
- InitWindows();
- InitMenus();
- TEInit();
- InitDialogs(0L);
- InitCursor();
-
- check_traps();
-
- err = AEInstallEventHandler(kCoreEventClass,kAEOpenDocuments,
- NewAEEventHandlerProc(do_ae_open_doc),0,0);
- err |= AEInstallEventHandler(kCoreEventClass,kAEPrintDocuments,
- NewAEEventHandlerProc(do_ae_print_doc),0,0);
- err |= AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,
- NewAEEventHandlerProc(do_ae_quit),0,0);
- err |= AEInstallEventHandler(kCoreEventClass,kAEOpenApplication,
- NewAEEventHandlerProc(do_ae_open_app),0,0);
- err |= AEInstallEventHandler('EMAC','pgst',
- NewAEEventHandlerProc(do_ae_page_setup),0,0);
- err |= AEInstallEventHandler('EMAC','opts',
- NewAEEventHandlerProc(do_ae_set_options),0,0);
- err |= AEInstallEventHandler('EMAC','rset',
- NewAEEventHandlerProc(do_ae_reset_options),0,0);
- err |= AESetInteractionAllowed(kAEInteractWithLocal);
- if (err) ExitToShell();
-
- reset_options();
- init_menus();
-
- quitting = 0;
- main_event_loop();
- }
-
- main_event_loop()
- {
- EventRecord e;
- char have_event;
-
- while (!quitting) {
- have_event = WaitNextEvent(everyEvent,&e,15,0L);
- if (!have_event) {
- SetCursor(&arrow);
- continue;
- }
-
- switch (e.what) {
- case mouseDown:
- do_mouseDown(&e);
- break;
- case kHighLevelEvent:
- AEProcessAppleEvent(&e);
- break;
- case keyDown:
- case autoKey:
- do_keyDown(&e);
- break;
- case nullEvent:
- case updateEvt:
- case activateEvt:
- case osEvt:
- break;
- }
- }
- }
-
- do_mouseDown(EventRecord *e)
- {
- short partCode;
- WindowPtr w;
- long choice;
-
- switch (partCode = FindWindow(e->where,&w)) {
- case inMenuBar:
- choice = MenuSelect(e->where);
- if (HiWord(choice) != 0)
- do_menu(choice);
- break;
- case inGoAway:
- case inDrag:
- case inGrow:
- case inContent:
- case inZoomIn:
- case inZoomOut:
- break;
- }
- }
-
- init_menus(void)
- {
- apple_menu = GetMenu(128);
- AddResMenu(apple_menu,'DRVR');
- InsertMenu(apple_menu,0);
- file_menu = GetMenu(129);
- InsertMenu(file_menu,0);
- DrawMenuBar();
- }
-
- do_menu(long choice)
- {
- unsigned char s[256];
- short menu,item;
-
- menu = HiWord(choice);
- item = LoWord(choice);
-
- switch (menu) {
- case 128:
- switch (item) {
- case apple_menu_about: do_about(); break;
- default: GetItem(apple_menu,item,s);
- OpenDeskAcc(s);
- break;
- }
- break;
- case 129:
- switch (item) {
- case file_menu_page_setup: do_page_setup(); break;
- case file_menu_print: do_print(); break;
- case file_menu_quit: quitting = 1; break;
- }
- break;
- }
-
- HiliteMenu(0);
- }
-
- do_keyDown(EventRecord *e)
- {
- char c;
- long choice;
-
- if (e->modifiers & cmdKey) {
- if (e->what != autoKey) {
- c = e->message & charCodeMask;
- choice = MenuKey(c);
- if (choice != 0) do_menu(choice);
- }
- }
- }
-
- do_about(void)
- {
- Alert(130,0L);
- }
-
- do_print(void)
- {
- SFTypeList typeList;
- StandardFileReply reply;
-
- typeList[0] = 'TEXT';
- StandardGetFile(0L,1,typeList,&reply);
- if (!reply.sfGood) return;
- reset_options();
- do_print_spec(&reply.sfFile);
- }
-
- int
- do_page_setup(void)
- {
- THPrint hPrint;
- short pref_err,accepted;
- int retcode = 1;
-
- pref_err = get_preference('PREC',128,&hPrint);
- PrOpen();
- if (PrError()) return retcode;
- if (pref_err) {
- hPrint = (THPrint)NewHandle(sizeof(TPrint));
- if (MemError()) goto bail;
- PrintDefault(hPrint);
- if (PrError()) goto bail;
- }
- else {
- PrValidate(hPrint);
- if (PrError()) goto bail;
- }
-
- accepted = PrStlDialog(hPrint);
- if (PrError() || !accepted) goto bail;
-
- set_preference('PREC',128,hPrint);
- retcode = 0;
-
- bail:
- PrClose();
- return retcode;
- }
-
- void
- pstrcpy(unsigned char *s,unsigned char *t)
- {
- bcopy(t,s,t[0]+1L);
- }
-
- void
- pstrcat(unsigned char *s,unsigned char *t)
- {
- if ((long)s[0] + (long)t[0] > 255L) return;
- bcopy(t+1,s+s[0]+1,(long)t[0]);
- s[0] += t[0];
- }
-