executor/src/prLowLevel.c

1284 lines
29 KiB
C

/*
* 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 <ctype.h>
#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 <Enter> 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;
}
}