home *** CD-ROM | disk | FTP | other *** search
/ MacGames Sampler / PHT MacGames Bundle.iso / MacSource Folder / Samples from the CD / Editors / emacs / Emacs-1.14b1-sources / sources / lprd-src / lprd.c < prev   
Encoding:
C/C++ Source or Header  |  1994-05-25  |  7.7 KB  |  404 lines  |  [TEXT/EMAC]

  1. /*
  2.  * Copyright (C) 1994 Marc Parmet.
  3.  * This file is part of the Macintosh port of GNU Emacs.
  4.  *
  5.  * GNU Emacs is distributed in the hope that it will be useful,
  6.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  7.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  8.  * GNU General Public License for more details.
  9.  */
  10.  
  11. /*
  12. to do:
  13. handle page range and copy count
  14. */
  15.  
  16. #include <MacHeaders>
  17. #include <Printing.h>
  18.  
  19. char quitting;
  20. char border_rect,print_format;
  21. MenuHandle apple_menu,file_menu;
  22.  
  23. enum {
  24.     apple_menu_about = 1,
  25.  
  26.     file_menu_page_setup = 1,
  27.     file_menu_print,
  28.     empty1,
  29.     file_menu_quit
  30. };
  31.  
  32. int
  33. have_required_params(AppleEvent *e)
  34. {
  35.     short err;
  36.     long actualSize;
  37.     DescType returnedType;
  38.  
  39.     err = AEGetAttributePtr(e,keyMissedKeywordAttr,typeWildCard,
  40.         &returnedType,0L,0,&actualSize);
  41.  
  42.     if (err == errAEDescNotFound)
  43.         return 0;
  44.     else if (err == 0)
  45.         return errAEEventNotHandled;
  46.     else
  47.         return err;
  48. }
  49.  
  50. pascal short
  51. do_ae_quit(AppleEvent *e,AppleEvent *reply,long refCon)
  52. {
  53.     short err = have_required_params(e);
  54.     if (err) return err;
  55.     quitting = 1;
  56.     return noErr;
  57. }
  58.  
  59. pascal short
  60. do_ae_open_doc(AppleEvent *e,AppleEvent *reply,long refCon)
  61. {
  62.     return errAEEventNotHandled;
  63. }
  64.  
  65. pascal short
  66. do_ae_page_setup(AppleEvent *e,AppleEvent *reply,long refCon)
  67. {
  68.     short err = have_required_params(e);
  69.     if (err) return err;
  70.     err = AEInteractWithUser(kAEDefaultTimeout,0L,0L);
  71.     if (err) return err;
  72.     do_page_setup();
  73.     return noErr;
  74. }
  75.  
  76. void
  77. reset_options(void)
  78. {
  79.     border_rect = 0;
  80.     print_format = 0;
  81. }
  82.  
  83. pascal short
  84. do_ae_reset_options(AppleEvent *e,AppleEvent *reply,long refCon)
  85. {
  86.     short err = have_required_params(e);
  87.     if (err) return err;
  88.     reset_options();
  89.     return noErr;
  90. }
  91.  
  92. pascal short
  93. do_ae_set_options(AppleEvent *e,AppleEvent *reply,long refCon)
  94. {
  95.     Boolean k;
  96.     short err;
  97.     long actualSize;
  98.     AEKeyword keywd;
  99.     long i,itemsInList;
  100.     AEDescList docList;
  101.     unsigned char s[256];
  102.     DescType returnedType;
  103.     
  104.     err = AEGetParamDesc(e,keyDirectObject,typeAEList,&docList);
  105.     if (err) return err;
  106.     err = have_required_params(e);
  107.     if (err) return err;
  108.     err = AECountItems(&docList,&itemsInList);
  109.     if (err) return err;
  110.     i = 1;
  111.     while (i < itemsInList) {
  112.         err = AEGetNthPtr(&docList,i++,typeChar,&keywd,&returnedType,s,
  113.                           sizeof(s),&actualSize);
  114.         if (err) continue;
  115.         s[actualSize] = '\0';
  116.         if (!strcmp(s,"p")) {
  117.             err = AEGetNthPtr(&docList,i++,typeBoolean,&keywd,&returnedType,&k,
  118.                               sizeof(k),&actualSize);
  119.             if (err) continue;
  120.             print_format = k;
  121.         }
  122.         else if (!strcmp(s,"R")) {
  123.             err = AEGetNthPtr(&docList,i++,typeBoolean,&keywd,&returnedType,&k,
  124.                               sizeof(k),&actualSize);
  125.             if (err) continue;
  126.             border_rect = k;
  127.         }
  128.     }
  129.     
  130.     err = AEDisposeDesc(&docList);
  131.     if (err) return err;
  132.     return noErr;
  133. }
  134.  
  135. pascal Boolean
  136. idle_function(EventRecord *event,long *sleepTime,RgnHandle *mouseRgn)
  137. {
  138.     *sleepTime = 15;
  139.     *mouseRgn = 0L;
  140.  
  141.     switch (event->what) {
  142.     case nullEvent:
  143.     case updateEvt:
  144.     case activateEvt:
  145.     case osEvt:
  146.         // We never do anything for these events.
  147.         break;
  148.     }
  149.  
  150.     return 0;
  151. }
  152.  
  153. pascal short
  154. do_ae_print_doc(AppleEvent *e,AppleEvent *reply,long refCon)
  155. {
  156.     FSSpec fs;
  157.     AEDescList docList;
  158.     short err;
  159.     long i,itemsInList;
  160.     long actualSize;
  161.     AEKeyword keywd;
  162.     DescType returnedType;
  163.  
  164.     // If the sender specified kAEWaitReply and kAECanSwitchLayer, then
  165.     // we return from this right away and go right to the print job dialog.
  166.     err = AEInteractWithUser(kAEDefaultTimeout,0L,0L);
  167.     if (err) return err;
  168.  
  169.     err = AEGetParamDesc(e,keyDirectObject,typeAEList,&docList);
  170.     if (err) return err;
  171.     err = have_required_params(e);
  172.     if (err) return err;
  173.     err = AECountItems(&docList,&itemsInList);
  174.     if (err) return err;
  175.     for (i = 1; i<=itemsInList; ++i) {
  176.         err = AEGetNthPtr(&docList,i,typeFSS,&keywd,&returnedType,&fs,
  177.                           sizeof(FSSpec),&actualSize);
  178.         if (err) continue;
  179.         do_print_spec(&fs);
  180.     }
  181.     
  182.     err = AEDisposeDesc(&docList);
  183.     if (err) return err;
  184.     return noErr;
  185. }
  186.  
  187. pascal short
  188. do_ae_open_app(AppleEvent *e,AppleEvent *reply,long refCon)
  189. {
  190.     short err = have_required_params(e);
  191.     if (err) return err;
  192.     return noErr;
  193. }
  194.  
  195. main()
  196. {
  197.     short err;
  198.  
  199.     MaxApplZone();
  200.     InitGraf(&thePort);
  201.     InitFonts();
  202.     FlushEvents(everyEvent,0);
  203.     InitWindows();
  204.     InitMenus();
  205.     TEInit();
  206.     InitDialogs(0L);
  207.     InitCursor();
  208.  
  209.     check_traps();
  210.  
  211.     err  = AEInstallEventHandler(kCoreEventClass,kAEOpenDocuments,
  212.                                  NewAEEventHandlerProc(do_ae_open_doc),0,0);
  213.     err |= AEInstallEventHandler(kCoreEventClass,kAEPrintDocuments,
  214.                                  NewAEEventHandlerProc(do_ae_print_doc),0,0);
  215.     err |= AEInstallEventHandler(kCoreEventClass,kAEQuitApplication,
  216.                                  NewAEEventHandlerProc(do_ae_quit),0,0);
  217.     err |= AEInstallEventHandler(kCoreEventClass,kAEOpenApplication,
  218.                                  NewAEEventHandlerProc(do_ae_open_app),0,0);
  219.     err |= AEInstallEventHandler('EMAC','pgst',
  220.                                  NewAEEventHandlerProc(do_ae_page_setup),0,0);
  221.     err |= AEInstallEventHandler('EMAC','opts',
  222.                                  NewAEEventHandlerProc(do_ae_set_options),0,0);
  223.     err |= AEInstallEventHandler('EMAC','rset',
  224.                                  NewAEEventHandlerProc(do_ae_reset_options),0,0);
  225.     err |= AESetInteractionAllowed(kAEInteractWithLocal);
  226.     if (err) ExitToShell();
  227.  
  228.     reset_options();
  229.     init_menus();
  230.     
  231.     quitting = 0;
  232.     main_event_loop();
  233. }
  234.  
  235. main_event_loop()
  236. {
  237.     EventRecord e;
  238.     char have_event;
  239.  
  240.     while (!quitting) {
  241.         have_event = WaitNextEvent(everyEvent,&e,15,0L);
  242.         if (!have_event) {
  243.             SetCursor(&arrow);
  244.             continue;
  245.         }
  246.  
  247.         switch (e.what) {
  248.         case mouseDown:
  249.             do_mouseDown(&e);
  250.             break;
  251.         case kHighLevelEvent:
  252.             AEProcessAppleEvent(&e);
  253.             break;
  254.         case keyDown:
  255.         case autoKey:
  256.             do_keyDown(&e);
  257.             break;
  258.         case nullEvent:
  259.         case updateEvt:
  260.         case activateEvt:
  261.         case osEvt:
  262.             break;
  263.         }
  264.     }
  265. }
  266.  
  267. do_mouseDown(EventRecord *e)
  268. {
  269.     short partCode;
  270.     WindowPtr w;
  271.     long choice;
  272.     
  273.     switch (partCode = FindWindow(e->where,&w)) {
  274.     case inMenuBar:
  275.         choice = MenuSelect(e->where);
  276.         if (HiWord(choice) != 0)
  277.             do_menu(choice);
  278.         break;
  279.     case inGoAway:
  280.     case inDrag:
  281.     case inGrow:
  282.     case inContent:
  283.     case inZoomIn:
  284.     case inZoomOut:
  285.         break;
  286.     }
  287. }
  288.  
  289. init_menus(void)
  290. {
  291.     apple_menu = GetMenu(128);
  292.     AddResMenu(apple_menu,'DRVR');
  293.     InsertMenu(apple_menu,0);
  294.     file_menu = GetMenu(129);
  295.     InsertMenu(file_menu,0);
  296.     DrawMenuBar();
  297. }
  298.  
  299. do_menu(long choice)
  300. {
  301.     unsigned char s[256];
  302.     short menu,item;
  303.     
  304.     menu = HiWord(choice);
  305.     item = LoWord(choice);
  306.     
  307.     switch (menu) {
  308.     case 128:
  309.         switch (item) {
  310.         case apple_menu_about: do_about(); break;
  311.         default:    GetItem(apple_menu,item,s);
  312.                     OpenDeskAcc(s);
  313.                     break;
  314.         }
  315.         break;
  316.     case 129:
  317.         switch (item) {
  318.         case file_menu_page_setup: do_page_setup();    break;
  319.         case file_menu_print:    do_print();            break;
  320.         case file_menu_quit:    quitting = 1;        break;
  321.         }
  322.         break;
  323.     }
  324.     
  325.     HiliteMenu(0);
  326. }
  327.  
  328. do_keyDown(EventRecord *e)
  329. {
  330.     char c;
  331.     long choice;
  332.     
  333.     if (e->modifiers & cmdKey) {
  334.         if (e->what != autoKey) {
  335.             c = e->message & charCodeMask;
  336.             choice = MenuKey(c);
  337.             if (choice != 0) do_menu(choice);
  338.         }
  339.     }
  340. }
  341.  
  342. do_about(void)
  343. {
  344.     Alert(130,0L);
  345. }
  346.  
  347. do_print(void)
  348. {
  349.     SFTypeList typeList;
  350.     StandardFileReply reply;
  351.  
  352.     typeList[0] = 'TEXT';
  353.     StandardGetFile(0L,1,typeList,&reply);
  354.     if (!reply.sfGood) return;
  355.     reset_options();
  356.     do_print_spec(&reply.sfFile);
  357. }
  358.  
  359. int
  360. do_page_setup(void)
  361. {
  362.     THPrint hPrint;
  363.     short pref_err,accepted;
  364.     int retcode = 1;
  365.  
  366.     pref_err = get_preference('PREC',128,&hPrint);
  367.     PrOpen();
  368.     if (PrError()) return retcode;
  369.     if (pref_err) {
  370.         hPrint = (THPrint)NewHandle(sizeof(TPrint));
  371.         if (MemError()) goto bail;
  372.         PrintDefault(hPrint);
  373.         if (PrError()) goto bail;
  374.     }
  375.     else {
  376.         PrValidate(hPrint);
  377.         if (PrError()) goto bail;
  378.     }
  379.  
  380.     accepted = PrStlDialog(hPrint);
  381.     if (PrError() || !accepted) goto bail;
  382.     
  383.     set_preference('PREC',128,hPrint);
  384.     retcode = 0;
  385.     
  386.     bail:
  387.     PrClose();
  388.     return retcode;
  389. }
  390.  
  391. void
  392. pstrcpy(unsigned char *s,unsigned char *t)
  393. {
  394.     bcopy(t,s,t[0]+1L);
  395. }
  396.  
  397. void
  398. pstrcat(unsigned char *s,unsigned char *t)
  399. {
  400.     if ((long)s[0] + (long)t[0] > 255L) return;
  401.     bcopy(t+1,s+s[0]+1,(long)t[0]);
  402.     s[0] += t[0];
  403. }
  404.