/* * Copyright 1989 - 1997 by Abacus Research and * Development, Inc. All rights reserved. */ #if !defined (OMIT_RCSID_STRINGS) char ROMlib_rcsid_prLowLevel[] = "$Id: prLowLevel.c 87 2005-05-25 01:57:33Z ctm $"; #endif /* Forward declarations in PrintMgr.h (DO NOT DELETE THIS LINE) */ #include "rsys/common.h" #include "QuickDraw.h" #include "PrintMgr.h" #include "MemoryMgr.h" #include "OSUtil.h" #include "BinaryDecimal.h" #include "ControlMgr.h" #include "ResourceMgr.h" #include "rsys/nextprint.h" #include "rsys/pstuff.h" #include "rsys/print.h" #include "rsys/hook.h" #include "rsys/ctl.h" #include "rsys/ini.h" #include "rsys/notmac.h" #include #include "MenuMgr.h" #include "rsys/vdriver.h" #include "rsys/uniquefile.h" #include "rsys/system_error.h" #include "rsys/options.h" #include "rsys/string.h" #include "rsys/osevent.h" #if defined (CYGWIN32) #include "win_print.h" #endif PUBLIC uint32 ROMlib_PrDrvrVers = 70; P0(PUBLIC pascal trap, void, PrDrvrOpen) /* TODO */ { warning_unimplemented (NULL_STRING); } P0(PUBLIC pascal trap, void, PrDrvrClose) /* TODO */ { warning_unimplemented (NULL_STRING); } P4(PUBLIC pascal trap, void, PrCtlCall, INTEGER, iWhichCtl, LONGINT, lParam1, LONGINT, lParam2, LONGINT, lParam3) /* TODO */ { warning_unimplemented (NULL_STRING); } P0(PUBLIC pascal trap, Handle, PrDrvrDCE) /* TODO */ { return (Handle) 0; } P0(PUBLIC pascal trap, INTEGER, PrDrvrVers) { INTEGER retval; retval = ROMlib_PrDrvrVers; return retval; } PRIVATE ControlHandle GetDControl (DialogPtr dp, INTEGER itemno) { HIDDEN_Handle h; ControlHandle retval; INTEGER unused; GetDItem (dp, itemno, &unused, &h, NULL); retval = (ControlHandle) MR (h.p); return retval; } PRIVATE Handle GetDIText (DialogPtr dp, INTEGER itemno) { HIDDEN_Handle h; Handle retval; INTEGER unused; GetDItem(dp, itemno, &unused, &h, NULL); retval = MR (h.p); return retval; } PUBLIC LONGINT GetDILong (DialogPtr dp, INTEGER item, LONGINT _default) { Str255 str; LONGINT retval; Handle h; h = GetDIText (dp, item); GetIText (h, str); if (str[0] == 0 || str[1] < '0' || str[1] > '9') retval = _default; else StringToNum (str, &retval); return retval; } #if defined (CYGWIN32) PUBLIC win_printp_t ROMlib_wp; #endif P2(PUBLIC pascal, void, ROMlib_myjobproc, DialogPtr, dp, INTEGER, itemno) { switch (itemno) { case PRINT_OK_NO: { ControlHandle ch; THPrint hPrint; INTEGER num_copies; hPrint = MR (((TPPrDlg)dp)->hPrintUsr); ch = GetDControl (dp, PRINT_ALL_RADIO_NO); if (GetCtlValue (ch)) { HxX(hPrint, prJob.iFstPage) = CWC(1); HxX(hPrint, prJob.iLstPage) = CWC(9999); } else { INTEGER first, last; first = GetDILong (dp, PRINT_FIRST_BOX_NO, 1); last = GetDILong (dp, PRINT_LAST_BOX_NO, 9999); HxX(hPrint, prJob.iFstPage) = CW (first); HxX(hPrint, prJob.iLstPage) = CW (last); } { num_copies = GetDILong (dp, PRINT_COPIES_BOX_NO, 1); HxX(hPrint, prJob.iCopies) = CW (num_copies); } #if defined (CYGWIN32) #warning TODO use better x and y coords warning_trace_info ("ROMlib_printer = %s, WIN32_TOKEN = %s", ROMlib_printer, WIN32_TOKEN); if (strcmp (ROMlib_printer, WIN32_TOKEN) == 0) { orientation_t orient; if (strcmp (ROMlib_paper_orientation, "Portrait") == 0) orient = WIN_PRINT_PORTRAIT; else orient = WIN_PRINT_LANDSCAPE; get_info (&ROMlib_wp, ROMlib_paper_x, ROMlib_paper_y, orient, num_copies, NULL); HxX(hPrint, prJob.iCopies) = CWC (1); /* Win32 driver handles the multiple copies for us */ } #endif } break; case PRINT_ALL_RADIO_NO: case PRINT_FROM_RADIO_NO: case PRINT_FIRST_BOX_NO: case PRINT_LAST_BOX_NO: { ControlHandle ch; ch = GetDControl (dp, PRINT_ALL_RADIO_NO); SetCtlValue (ch, itemno == PRINT_ALL_RADIO_NO ? 1 : 0); ch = GetDControl (dp, PRINT_FROM_RADIO_NO); SetCtlValue (ch, itemno == PRINT_ALL_RADIO_NO ? 0 : 1); if (itemno == PRINT_ALL_RADIO_NO) { SetIText (GetDIText (dp, PRINT_FIRST_BOX_NO), (StringPtr) ""); SetIText (GetDIText (dp, PRINT_LAST_BOX_NO), (StringPtr) ""); } } default:; } } PRIVATE void add_orientation_icons_to_update_region (DialogPtr dp) { GrafPtr gp; Rect r; INTEGER unused; gp = thePort; SetPort (dp); GetDItem (dp, LAYOUT_PORTRAIT_NO, &unused, NULL, &r); InvalRect (&r); GetDItem (dp, LAYOUT_LANDSCAPE_NO, &unused, NULL, &r); InvalRect (&r); SetPort (gp); } #define SWAP(a, b) do \ { \ typeof (a) __temp; \ \ __temp = a; \ a = b; \ b = __temp; \ } \ while (FALSE); PRIVATE void update_orientation (DialogPtr dp, INTEGER button) { switch (button) { case LAYOUT_LANDSCAPE_ICON_NO: if (strcmp (ROMlib_paper_orientation, "Landscape") != 0) { ROMlib_paper_orientation = "Landscape"; add_orientation_icons_to_update_region (dp); } break; case LAYOUT_PORTRAIT_ICON_NO: if (strcmp (ROMlib_paper_orientation, "Portrait") != 0) { ROMlib_paper_orientation = "Portrait"; add_orientation_icons_to_update_region (dp); } break; default: warning_unexpected ("button = %d", button); break; } } PUBLIC char * cstring_from_str255 (Str255 text) { int len; char *retval; len = (uint8)text[0]; retval = malloc (len+1); if (retval) { memcpy (retval, text+1, len); retval[len] = 0; } return retval; } PUBLIC ini_key_t ROMlib_printer = NULL; PRIVATE ini_key_t ROMlib_paper = NULL; PUBLIC ini_key_t ROMlib_port = NULL; PUBLIC ini_key_t ROMlib_paper_orientation = NULL; PRIVATE ini_key_t ROMlib_spool_template = NULL; #if defined (MSDOS) || defined (CYGWIN32) PRIVATE ini_key_t ROMlib_print_filter = NULL; #endif PRIVATE MenuHandle GetPopUpMenu (ControlHandle ch) { MenuHandle retval; popup_data_handle dh; dh = (popup_data_handle) CTL_DATA (ch); retval = dh ? POPUP_MENU (dh) : 0; return retval; } PRIVATE ini_key_t find_item_key (DialogPtr dlg, INTEGER itemno) { MenuHandle mh; ControlHandle ch; Str255 text; ini_key_t retval; ch = GetDControl (dlg, itemno); mh = GetPopUpMenu (ch); GetItem (mh, GetCtlValue (ch), text); retval = cstring_from_str255 (text); return retval; } PUBLIC char *ROMlib_spool_file; PUBLIC void update_printing_globals (void) { { value_t dimensions; /* toss in some defaults, just in case someone screwed up the .ini file */ ROMlib_paper_x = 612; ROMlib_paper_y = 792; dimensions = find_key ("Paper Size", ROMlib_paper); if (dimensions) sscanf (dimensions, "%d %d", &ROMlib_paper_x, &ROMlib_paper_y); } if ((strcmp (ROMlib_paper_orientation, "Portrait") == 0) == (ROMlib_paper_x > ROMlib_paper_y)) SWAP (ROMlib_paper_x, ROMlib_paper_y); ROMlib_document_paper_sizes = "%%DocumentPaperSizes: "; ROMlib_paper_size = "%%PaperSize: "; ROMlib_paper_size_name = ROMlib_paper; ROMlib_paper_size_name_terminator = "\n"; if (ROMlib_paper_x < ROMlib_paper_y) { ROMlib_rotation = 0; ROMlib_translate_x = 0; ROMlib_translate_y = ROMlib_paper_y; } else { ROMlib_rotation = -90; ROMlib_translate_x = -ROMlib_paper_x; ROMlib_translate_y = ROMlib_paper_y; } } PRIVATE void update_ROMlib_printer_vars (TPPrDlg dp) { if (ROMlib_printer) free (ROMlib_printer); ROMlib_printer = find_item_key ((DialogPtr) dp, LAYOUT_PRINTER_TYPE_NO); if (ROMlib_paper) free (ROMlib_paper); ROMlib_paper = find_item_key ((DialogPtr) dp, LAYOUT_PAPER_NO); if (ROMlib_port) free (ROMlib_port); ROMlib_port = find_item_key ((DialogPtr) dp, LAYOUT_PORT_MENU_NO); ROMlib_set_default_resolution (MR (dp->hPrintUsr), 72, 72); if (strcmp (ROMlib_printer, "PostScript File") == 0) { Handle h; Size hs; h = GetDIText ((DialogPtr) dp, LAYOUT_FILENAME_NO); hs = GetHandleSize (h); if (hs > 0) { if (ROMlib_spool_file) free (ROMlib_spool_file); ROMlib_spool_file = malloc (hs + 1); memcpy (ROMlib_spool_file, STARH (h), hs); ROMlib_spool_file [hs] = 0; } } if (ROMlib_PrintDef) { FILE *fp; fp = open_ini_file_for_writing (ROMlib_PrintDef); if (fp) { add_heading_to_file (fp, "Defaults"); if (ROMlib_printer) add_key_value_to_file (fp, "Printer", ROMlib_printer); if (ROMlib_paper) add_key_value_to_file (fp, "Paper Size", ROMlib_paper); if (ROMlib_port) add_key_value_to_file (fp, "Port", ROMlib_port); if (ROMlib_paper_orientation) add_key_value_to_file (fp, "Orientation", ROMlib_paper_orientation); close_ini_file (fp); } } } #if !defined (LINUX) PRIVATE void get_popup_bounding_box (Rect *rp, DialogPtr dp, INTEGER itemno) { INTEGER unused; GetDItem (dp, itemno, &unused, NULL, rp); rp->left = CW (CW (rp->left) - 1); rp->bottom = CW (CW (rp->bottom) + 3); } #endif /* check to see if we've changed to or from a PostScript file */ typedef enum { PRINT_TO_PORT, PRINT_TO_FILE, #if defined (CYGWIN32) PRINT_TO_WIN32, #endif } print_where_t; PRIVATE print_where_t print_where; PRIVATE boolean_t filename_chosen_p = FALSE; PRIVATE void update_port (DialogPtr dp) { GrafPtr gp; char *keyp; gp = thePort; SetPort (dp); keyp = find_item_key (dp, LAYOUT_PRINTER_TYPE_NO); if (strcmp (keyp, "PostScript File") == 0) { if (print_where != PRINT_TO_FILE) { #if !defined (LINUX) Rect r; get_popup_bounding_box (&r, dp, LAYOUT_PORT_MENU_NO); EraseRect (&r); HideDItem (dp, LAYOUT_PORT_LABEL_NO); HideDItem (dp, LAYOUT_PORT_MENU_NO); vdriver_flush_display(); #endif ShowDItem (dp, LAYOUT_FILENAME_LABEL_NO); if (!filename_chosen_p) { Str255 str; unique_file_name (ROMlib_spool_template, "execout*.ps", str); SetIText (GetDIText (dp, LAYOUT_FILENAME_NO), str); filename_chosen_p = TRUE; } ShowDItem (dp, LAYOUT_FILENAME_NO); SelIText (dp, LAYOUT_FILENAME_NO, 0, 32767); print_where = PRINT_TO_FILE; } } #if defined (CYGWIN32) else if (strcmp (keyp, WIN32_TOKEN) == 0) { if (print_where != PRINT_TO_WIN32) { Rect r; get_popup_bounding_box (&r, dp, LAYOUT_PORT_MENU_NO); EraseRect (&r); HideDItem (dp, LAYOUT_PORT_LABEL_NO); HideDItem (dp, LAYOUT_PORT_MENU_NO); HideDItem (dp, LAYOUT_FILENAME_LABEL_NO); HideDItem (dp, LAYOUT_FILENAME_NO); vdriver_flush_display(); print_where = PRINT_TO_WIN32; } } #endif else { if (print_where != PRINT_TO_PORT) { HideDItem (dp, LAYOUT_FILENAME_LABEL_NO); HideDItem (dp, LAYOUT_FILENAME_NO); #if !defined (LINUX) { Rect r; ShowDItem (dp, LAYOUT_PORT_LABEL_NO); ShowDItem (dp, LAYOUT_PORT_MENU_NO); get_popup_bounding_box (&r, dp, LAYOUT_PORT_MENU_NO); InvalRect (&r); } #else vdriver_flush_display(); #endif print_where = PRINT_TO_PORT; } } free (keyp); SetPort (gp); } P2(PUBLIC pascal, void, ROMlib_mystlproc, DialogPtr, dp, INTEGER, itemno) { switch(itemno) { case LAYOUT_OK_NO: #if defined(NEXTSTEP) printstate = seenPageSetUp; contextswitch(&romlib_sp, &nextstep_sp); #endif update_ROMlib_printer_vars ((TPPrDlg) dp); break; case LAYOUT_PORTRAIT_ICON_NO: case LAYOUT_LANDSCAPE_ICON_NO: update_orientation (dp, itemno); break; case LAYOUT_PRINTER_TYPE_NO: update_port (dp); break; default: break; } } typedef pascal TPPrDlg (*prinitprocp) (THPrint hPrint); typedef pascal void (*pritemprocp) (TPPrDlg prrecptr, INTEGER item); #if !defined (BINCOMPAT) #define CALLPRINITPROC(hPrint, fp) (*(prinitprocpfp))(hPrint) #define CALLPRITEMPROC(prrecptr, item, fp) \ (*(pritemprocp fp))(prrecptr, item) #else /* BINCOMPAT */ #define CALLPRINITPROC(hPrint, fp) \ ROMlib_CALLPRINITPROC((hPrint), (prinitprocp)(fp)) A2(static inline, TPPrDlg, ROMlib_CALLPRINITPROC, THPrint, hPrint, prinitprocp, fp) { TPPrDlg retval; ROMlib_hook(pr_initnumber); if (fp == P_PrStlInit) retval = C_PrStlInit(hPrint); else if (fp == P_PrJobInit) retval = C_PrJobInit(hPrint); else { HOOKSAVEREGS(); retval = (TPPrDlg) CToPascalCall(fp, CTOP_PrStlInit, hPrint); HOOKRESTOREREGS(); } return retval; } #define CALLPRITEMPROC(prrecptr, item, fp) \ ROMlib_CALLPRITEMPROC((prrecptr), (item), (pritemprocp) (fp)) A3(static inline, void, ROMlib_CALLPRITEMPROC, TPPrDlg, prrecptr, INTEGER, item, pritemprocp, fp) { ROMlib_hook(pr_itemnumber); if (fp == (pritemprocp) P_ROMlib_myjobproc) C_ROMlib_myjobproc((DialogPtr) prrecptr, item); else if (fp == (pritemprocp) P_ROMlib_mystlproc) C_ROMlib_mystlproc((DialogPtr) prrecptr, item); else { HOOKSAVEREGS(); CToPascalCall(fp, CTOP_ROMlib_myjobproc, prrecptr, item); HOOKRESTOREREGS(); } } #endif /* BINCOMPAT */ P3(PUBLIC, pascal BOOLEAN, ROMlib_stlfilterproc, DialogPeek, dp, EventRecord *, evt, INTEGER *, ith) { BOOLEAN retval; char *keyp; retval = FALSE; /* Check for user hitting or clicking on "OK" button */ switch (evt->what) { case CWC (keyDown): { char c; c = CL (evt->message) & 0xFF; if (c == '\r' || c == NUMPAD_ENTER) { maybe_wait_for_keyup (); *ith = CWC (OK); retval = TRUE; } } break; case CWC (mouseDown): { Point localp; GrafPtr gp; Rect r; HIDDEN_Handle h; INTEGER unused; localp = evt->where; gp = thePort; SetPort((GrafPtr) dp); GlobalToLocal(&localp); localp.h = CW(localp.h); localp.v = CW(localp.v); SetPort(gp); GetDItem ((DialogPtr) dp, OK, &unused, &h, &r); if (PtInRect (localp, &r)) { ControlHandle ch; ch = (ControlHandle) MR (h.p); if (TrackControl (ch, localp, NULL)) { *ith = CWC (OK); retval = TRUE; } } break; } default: break; } keyp = find_item_key ((DialogPtr) dp, LAYOUT_PRINTER_TYPE_NO); if (retval && *ith == CWC (OK) && (strcmp (keyp, "PostScript File") == 0)) { struct stat sbuf; Handle h; char *filename; int len; h = GetDIText ((DialogPtr) dp, LAYOUT_FILENAME_NO); len = GetHandleSize (h); filename = alloca (len+1); memcpy (filename, STARH (h), len); filename[len] = 0; if (stat (filename, &sbuf) == 0) { char *buf; #define EXISTS_MESSAGE \ "The file \"%s\" already exists. " \ "Click on the \"Change\" button to choose a different filename. " \ "If you click on the \"Overwrite\" button, " \ "\"%s\" will be overwritten as soon as you print." buf = alloca (sizeof (EXISTS_MESSAGE) + strlen (filename) + strlen (filename) + 1); sprintf (buf, EXISTS_MESSAGE, filename, filename); if (system_error (buf, 0, "Change", "Overwrite", NULL, NULL, NULL, NULL) == 0) *ith = CWC (LAYOUT_CIRCLE_OK_NO); /* dummy return value */ } } free (keyp); return retval; } P3(PUBLIC, pascal BOOLEAN, ROMlib_numsonlyfilterproc, DialogPeek, dp, EventRecord *, evt, INTEGER *, ith) { char c; if (Cx(evt->what) == keyDown) { c = Cx(evt->message) & 0xFF; switch(c) { case '\r': case NUMPAD_ENTER: maybe_wait_for_keyup (); *ith = CW(OK); return TRUE; break; default: return FALSE; break; } } return FALSE; } PRIVATE void set_userItem (DialogPtr dp, INTEGER itemno, void *funcp) { Rect r; INTEGER unused; GetDItem(dp, itemno, &unused, NULL, &r); SetDItem(dp, itemno, userItem, funcp, &r); } PRIVATE void adjust_num_copies (TPPrDlg dlg, THPrint hPrint) { Str255 text; NumToString (Hx(hPrint, prJob.iCopies), text); SetIText (GetDIText ((DialogPtr) dlg, PRINT_COPIES_BOX_NO), text); SelIText ((DialogPtr) dlg, PRINT_COPIES_BOX_NO, 0, 100); #if defined (CYGWIN32) if (strcmp (ROMlib_printer, WIN32_TOKEN) == 0) { HideDItem ((DialogPtr) dlg, PRINT_COPIES_LABEL_NO); HideDItem ((DialogPtr) dlg, PRINT_COPIES_BOX_NO); } #endif } PRIVATE void adjust_print_range_controls (TPPrDlg dlg, THPrint hPrint) { ControlHandle ch; ch = GetDControl ((DialogPtr)dlg, PRINT_ALL_RADIO_NO); SetCtlValue (ch, 1); } PRIVATE ini_key_t get_default_key (ini_key_t key, ini_key_t default_if_not_found) { ini_key_t retval; retval = find_key ("Defaults", key); /* Verify that the default is legitimate */ if (!find_key (key, retval)) { pair_link_t *pairp; pairp = get_pair_link_n (key, 0); /* default is first legit entry */ if (pairp) retval = pairp->key; } if (!retval) retval = default_if_not_found; return retval; } PRIVATE void str255assignc (Str255 str, const char *cstr) { if (!cstr) str[0] = 0; else { str[0] = MIN ((int) strlen (cstr), 255); memcpy (str+1, cstr, (unsigned char) str[0]); } } PRIVATE void get_all_defaults (void) { static struct temp { ini_key_t *variablep; ini_key_t key; ini_key_t default_key; } default_table[] = { { &ROMlib_printer, "Printer", NULL, }, { &ROMlib_paper, "Paper Size", "Letter", }, { &ROMlib_port, "Port", "LPT1", }, { &ROMlib_paper_orientation, "Orientation", "Portrait", }, #if defined (MSDOS) || defined (CYGWIN32) { &ROMlib_print_filter, "Filter", "GhostScript", }, #endif }; int i; for (i = 0; i < (int) NELEM (default_table); ++i) if (!*default_table[i].variablep) *default_table[i].variablep = get_default_key (default_table[i].key, default_table[i].default_key); ROMlib_spool_template = find_key ("Printer", "PostScript File"); if (!ROMlib_spool_template) ROMlib_spool_template = "+/execout*.ps"; } PRIVATE void adjust_print_name (DialogPtr dp) { Str255 name; if (!ROMlib_spool_file) { Str255 str; unique_file_name (ROMlib_spool_template, "execout*.ps", str); ROMlib_spool_file = cstring_from_str255 (str); } if (strcmp (ROMlib_printer, "PostScript File") == 0) str255assignc (name, ROMlib_spool_file); else str255assignc (name, ROMlib_printer); SetIText (GetDIText (dp, 3), name); } P1(PUBLIC pascal trap, TPPrDlg, PrJobInit, THPrint, hPrint) { TPPrDlg retval; printer_init (); if (ROMlib_printresfile != -1) { retval = (TPPrDlg) NewPtr(sizeof(TPrDlg)); if (GetNewDialog(-8191, (Ptr) retval, (WindowPtr) -1)) { /* TODO: Figure out what to do with the printer name, vs. the spool file name */ set_userItem ((DialogPtr) retval, PRINT_CIRCLE_OK_NO, P_ROMlib_circle_ok); adjust_num_copies (retval, hPrint); adjust_print_range_controls (retval, hPrint); adjust_print_name ((DialogPtr) retval); retval->pFltrProc = RM((ProcPtr) P_ROMlib_numsonlyfilterproc); /* TODO: Get this from the right place */ retval->pItemProc = RM((ProcPtr) P_ROMlib_myjobproc); /* TODO: Get this from the right place */ retval->hPrintUsr = RM(hPrint); } else { DisposPtr((Ptr) retval); retval = 0; } } else retval = 0; return retval; } P2(PUBLIC, pascal void, ROMlib_circle_ok, DialogPeek, dp, INTEGER, which) { Rect r; INTEGER unused; GetDItem ((DialogPtr) dp, which, &unused, NULL, &r); PenNormal (); PenSize (3, 3); InsetRect (&r, -4, -4); if (!(ROMlib_options & ROMLIB_RECT_SCREEN_BIT)) FrameRoundRect (&r, 16, 16); else FrameRect (&r); } P2(PUBLIC, pascal void, ROMlib_orientation, DialogPeek, dp, INTEGER, which) { Rect r; INTEGER unused; GetDItem ((DialogPtr) dp, which, &unused, NULL, &r); PenNormal (); PenSize (1, 1); InsetRect (&r, 1, 1); if ((which == LAYOUT_PORTRAIT_NO) != (strcmp (ROMlib_paper_orientation, "Portrait") == 0)) PenPat (white); FrameRect (&r); PenPat (black); } PUBLIC char *ROMlib_PrintersIni; PUBLIC char *ROMlib_PrintDef; PRIVATE void adjust_menu_common (TPPrDlg dlg, INTEGER item, heading_t heading, ini_key_t defkey) { ControlHandle ch; MenuHandle mh; #if defined (MSDOS) || defined (CYGWIN32) boolean_t skip_all_but_a_few; if (strcmp (heading, "Printer") != 0) skip_all_but_a_few = FALSE; else { #if defined (MSDOS) ini_key_t filter; filter = find_key ("Filter", ROMlib_print_filter); if (!filter) skip_all_but_a_few = TRUE; else { struct stat sbuf; skip_all_but_a_few = stat (filter, &sbuf) != 0; } #else char *gs_dll; struct stat sbuf; gs_dll = get_gs_dll (NULL); skip_all_but_a_few = stat (gs_dll, &sbuf) != 0; free (gs_dll); #endif } #endif ch = GetDControl ((DialogPtr) dlg, item); if (ch) { mh = GetPopUpMenu (ch); if (mh) { { int i; pair_link_t *pairp; int default_index; GrafPtr gp; INTEGER max_wid; gp = thePort; SetPort ((GrafPtr) dlg); default_index = -1; max_wid = 0; for (i = 0; (pairp = get_pair_link_n (heading, i)); ++i) { Str255 str; INTEGER wid; #if defined (MSDOS) || defined (CYGWIN32) if (skip_all_but_a_few && strcmp (pairp->key, "Direct To Port") != 0 && strcmp (pairp->key, "PostScript File") != 0) continue; #endif if (strcmp (pairp->key, defkey) == 0) default_index = i; str255assignc (str, pairp->key); AppendMenu (mh, str); wid = StringWidth (str); if (wid > max_wid) max_wid = wid; } if (max_wid) { HIDDEN_Handle h; Rect r; INTEGER unused; GetDItem ((DialogPtr) dlg, item, &unused, &h, &r); r.right = CW (CW (r.left) + max_wid + 38); SetDItem ((DialogPtr) dlg, item, ctrlItem, MR (h.p), &r); SizeControl (ch, CW (r.right) - CW (r.left), CW (r.bottom) - CW (r.top)); } SetCtlMax (ch, i); if (default_index > -1) SetCtlValue (ch, default_index + 1); SetPort (gp); } } } } PRIVATE void adjust_paper_menu (TPPrDlg dlg) { adjust_menu_common (dlg, LAYOUT_PAPER_NO, "Paper Size", ROMlib_paper); } PRIVATE void adjust_printer_type_menu (TPPrDlg dlg) { adjust_menu_common (dlg, LAYOUT_PRINTER_TYPE_NO, "Printer", ROMlib_printer); } PRIVATE void adjust_port (TPPrDlg dlg) { #if !defined (LINUX) adjust_menu_common (dlg, LAYOUT_PORT_MENU_NO, "Port", ROMlib_port); #else HideDItem ((DialogPtr) dlg, LAYOUT_PORT_LABEL_NO); HideDItem ((DialogPtr) dlg, LAYOUT_PORT_MENU_NO); if (ROMlib_port) { free (ROMlib_port); ROMlib_port = NULL; } #endif } PRIVATE void set_default_orientation (TPPrDlg dlg) { INTEGER orientation_button; orientation_button = (ROMlib_paper_orientation && strcmp (ROMlib_paper_orientation, "Landscape") == 0) ? LAYOUT_LANDSCAPE_ICON_NO : LAYOUT_PORTRAIT_ICON_NO; update_orientation ((DialogPtr) dlg, orientation_button); } PUBLIC void printer_init (void) { static boolean_t ini_read_p = FALSE; if (!ini_read_p) { read_ini_file (ROMlib_PrintersIni); read_ini_file (ROMlib_PrintDef); get_all_defaults (); ini_read_p = TRUE; } } P1(PUBLIC pascal trap, TPPrDlg, PrStlInit, THPrint, hPrint) { TPPrDlg retval; printer_init (); if (ROMlib_printresfile != -1) { retval = (TPPrDlg) NewPtr(sizeof(TPrDlg)); if (GetNewDialog(-8192, (Ptr) retval, (WindowPtr) -1)) { filename_chosen_p = FALSE; print_where = PRINT_TO_PORT; HideDItem ((DialogPtr) retval, LAYOUT_FILENAME_LABEL_NO); HideDItem ((DialogPtr) retval, LAYOUT_FILENAME_NO); set_userItem ((DialogPtr) retval, LAYOUT_CIRCLE_OK_NO, P_ROMlib_circle_ok); set_userItem ((DialogPtr) retval, LAYOUT_PORTRAIT_NO, P_ROMlib_orientation); set_userItem ((DialogPtr) retval, LAYOUT_LANDSCAPE_NO, P_ROMlib_orientation); { Str255 appname; str255assignc (appname, ROMlib_appname); if (!(ROMlib_options & ROMLIB_NOLOWER_BIT)) { char *p; boolean_t all_upper; int n; /* convert all upper (e.g. EXECUTOR.EXE) to all lower (e.g. executor.exe) */ all_upper = TRUE; for (p = (char *) appname+1, n = appname[0]; n > 0 && all_upper; ++p, --n) if (islower (*p)) all_upper = FALSE; if (all_upper) for (p = (char *) appname+1, n = appname[0]; n > 0 ; ++p, --n) *p = tolower (*p); } /* remove trailing .exe */ #define EXE_SUFFIX ".exe" if (strcasecmp ((char *) appname + appname[0] + 1 - sizeof EXE_SUFFIX + 1, EXE_SUFFIX) == 0) appname[0] -= sizeof EXE_SUFFIX - 1; /* Capitalize first character */ if (islower (appname[1])) appname[1] = toupper ((unsigned char) appname[1]); ParamText (appname, 0, 0, 0); } if (ROMlib_new_printer_name || ROMlib_new_label) { Rect r; INTEGER item_type; HIDDEN_Handle hh; Handle h; Str255 str; int orig, new; Str255 new_printer_name; Str255 new_type_label; #define NEW_PRINTER_NAME "Print Selection" #define NEW_TYPE_LABEL "Print to:" str255_from_c_string (new_printer_name, ROMlib_new_printer_name ? ROMlib_new_printer_name : NEW_PRINTER_NAME); str255_from_c_string (new_type_label, ROMlib_new_label ? ROMlib_new_label : NEW_TYPE_LABEL); GetDItem ((DialogPtr) retval, LAYOUT_PRINTER_TYPE_LABEL_NO, &item_type, &hh, &r); h = MR (hh.p); GetIText (h, str); orig = StringWidth (str); new = StringWidth (new_type_label); HUnlock (h); r.left = CW (CW(r.left) + orig - new); SetDItem ((DialogPtr) retval, LAYOUT_PRINTER_TYPE_LABEL_NO, CW (item_type), h, &r); SetIText (GetDIText ((DialogPtr) retval, LAYOUT_PRINTER_NAME_NO), new_printer_name); SetIText (GetDIText ((DialogPtr) retval, LAYOUT_PRINTER_TYPE_LABEL_NO), new_type_label); } adjust_paper_menu (retval); adjust_printer_type_menu (retval); update_port ((DialogPtr) retval); adjust_port (retval); set_default_orientation (retval); /* must be called after paper menu is adjusted */ retval->pFltrProc = RM((ProcPtr) P_ROMlib_stlfilterproc); retval->pItemProc = RM((ProcPtr) P_ROMlib_mystlproc); retval->hPrintUsr = RM(hPrint); } else { DisposPtr((Ptr) retval); retval = 0; } } else retval = 0; return retval; } #define SUNPATH_HACK (ROMlib_options & ROMLIB_PRINTING_HACK_BIT) P2(PUBLIC pascal trap, BOOLEAN, PrDlgMain, THPrint, hPrint, ProcPtr, initfptr) { INTEGER item; TPPrDlg prrecptr; BOOLEAN retval; printer_init (); retval = FALSE; #if 0 && defined(NEXTSTEP) /* * NOTE: we don't actually call this because Excel sets up some goofy pages * and then we get way confused. */ ROMlib_updatenextpagerect((comRect *) &Hx(hPrint, rPaper)); #endif /* defined(NEXTSTEP) */ if ((prrecptr = CALLPRINITPROC(hPrint, initfptr))) { if (!SUNPATH_HACK || (((pritemprocp) MR(prrecptr->pItemProc) != (pritemprocp) P_ROMlib_myjobproc) || strcmp (ROMlib_printer, WIN32_TOKEN) != 0)) { ShowWindow((WindowPtr) prrecptr); SelectWindow((WindowPtr) prrecptr); } do { if (SUNPATH_HACK && (((pritemprocp) MR(prrecptr->pItemProc) == (pritemprocp) P_ROMlib_myjobproc) && strcmp (ROMlib_printer, WIN32_TOKEN) == 0)) item = 1; else { ModalDialog((ProcPtr) MR(prrecptr->pFltrProc), &item); item = CW(item); } CALLPRITEMPROC(prrecptr, item, MR(prrecptr->pItemProc)); #if defined (CYGWIN32) /* Don't allow them to continue Win32 stuff if we can't initialize the Win32 subsystem */ if (((pritemprocp) MR(prrecptr->pItemProc) == (pritemprocp) P_ROMlib_myjobproc) && item == 1 && strcmp (ROMlib_printer, WIN32_TOKEN) == 0 && !ROMlib_wp) { if (SUNPATH_HACK) item = 2; else item = 999; } #endif } while (item != 1 && item != 2); if (item == 1) { /* TODO: transfer data from prrecptr into hPrint */ C_PrValidate(hPrint); /* TODO: if PrValidate returns TRUE maybe ModalDialog should be called again.*/ retval = TRUE; } else retval = FALSE; CloseDialog((DialogPtr) prrecptr); DisposPtr((Ptr) prrecptr); } #if defined(NEXTSTEP) ROMlib_updatemacpagerect((comRect *) &HxX(hPrint, rPaper), (comRect *) &HxX(hPrint, prInfo.rPage), (comRect *) &HxX(hPrint, prInfoPT.rPage)); #endif /* defined(NEXTSTEP) */ return retval; } P1(PUBLIC pascal trap, void, PrGeneral, Ptr, pData) /* IMV-410 */ { TGnlData *tgp; tgp = (TGnlData *) pData; ((TGnlData *) pData)->iError = CWC(OpNotImpl); switch (CW(tgp->iOpCode)) { case GetRslData: { TGetRslBlk *resolp; resolp = (TGetRslBlk *) pData; resolp->iError = CWC (noErr); resolp->iRgType = CWC (1); resolp->xRslRg.iMin = CWC (0); resolp->xRslRg.iMax = CWC (0); resolp->yRslRg.iMin = CWC (0); resolp->yRslRg.iMax = CWC (0); resolp->rgRslRec[0].iXRsl = CWC (72); resolp->rgRslRec[0].iYRsl = CWC (72); if (ROMlib_optional_res_x <= 0 || ROMlib_optional_res_y <= 0) resolp->iRslRecCnt = CWC (1); else { resolp->iRslRecCnt = CWC (2); resolp->rgRslRec[1].iXRsl = CW (ROMlib_optional_res_x); resolp->rgRslRec[1].iYRsl = CW (ROMlib_optional_res_y); } } break; case SetRsl: { TSetRslBlk *resolp; resolp = (TSetRslBlk *) pData; if (!((resolp->iXRsl == CWC (72) && resolp->iYRsl == CWC (72)) || (resolp->iXRsl == CW (ROMlib_optional_res_x) && resolp->iYRsl == CW (ROMlib_optional_res_y)))) resolp->iError = CWC (NoSuchRsl); else { resolp->iError = CWC (noErr); ROMlib_set_default_resolution (MR (resolp->hPrint), CW (resolp->iYRsl), CW (resolp->iXRsl)); } } break; case DraftBits: warning_unimplemented ("DraftBits"); break; case NoDraftBits: warning_unimplemented ("NoDraftBits"); break; case GetRotn: warning_unimplemented ("GetRotn"); break; default: warning_unimplemented (NULL_STRING); break; } }