From 7553b7f9d4dddc2235c137d41de8ce22547bebe3 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Wed, 1 Jul 2015 17:36:37 +0200 Subject: Initial commit --- Linux_C_12/cprinter_121.c | 602 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 602 insertions(+) create mode 100644 Linux_C_12/cprinter_121.c (limited to 'Linux_C_12/cprinter_121.c') diff --git a/Linux_C_12/cprinter_121.c b/Linux_C_12/cprinter_121.c new file mode 100644 index 0000000..8e635a3 --- /dev/null +++ b/Linux_C_12/cprinter_121.c @@ -0,0 +1,602 @@ +/******************************************************************************************** + Clean OS Windows library module version 1.2.1. + This module is part of the Clean Object I/O library and Clean 0.8 I/O library + for the Windows platform. +********************************************************************************************/ + +/******************************************************************************************** + About this module: + Routines related to printing. +********************************************************************************************/ + +#include "util_121.h" +#include "cpicture_121.h" + +#include "cprinter_121.h" + +BOOL bUserAbort; +int semaphor=0; + +#if 0 +HWND hDlgPrint; +HWND hwndButton,hwndText; + +extern HWND ghMainWindow; +extern HINSTANCE ghInst; +#else +#define CALLBACK +#define APIENTRY +typedef void* HANDLE; +typedef void* HWND; +typedef void* DEVMODE; +typedef void* PRINTDLG; +typedef void** LPHANDLE; +typedef char* LPCTSTR; +#endif + + +#define tachtig 80 +void getDevmodeSizeC(int *size, HANDLE *phPrinter, + char **device, char **driver, char **output) +{ +#if 0 + char szPrinter[80]; + char *szDevice, *szDriver, *szOutput; + + GetProfileString("windows", "device", ",,,", szPrinter, 80); + szDevice = strtok(szPrinter,","); + szDriver = strtok(NULL,", "); + szOutput = strtok(NULL,", "); + *device = g_strdup(szDevice); + *driver = g_strdup(szDriver); + *output = g_strdup(szOutput); + if (*szDevice=='\0' || *szDriver=='\0' || *szOutput=='\0') + { + *size = 0; + return; + }; + OpenPrinter(szDevice,phPrinter,NULL); + *size = DocumentProperties(NULL,*phPrinter,szDevice,NULL,NULL,0); +#endif +} + +void getDefaultDevmodeC(char *printSetup, LPHANDLE phPrinter, char **device) +{ +#if 0 + int size,r1; + + size = ((int*)printSetup)[0]; + printSetup +=4; + r1 = DocumentProperties(NULL,phPrinter,((char*)device)+4, + (DEVMODE*)printSetup,NULL,DM_OUT_BUFFER); + ClosePrinter(phPrinter); +#endif +} + +#if 0 +static HDC myCreateIC(LPCTSTR driver, LPCTSTR device, DEVMODE *devmode) +{ + HDC icPrint; + + icPrint = CreateIC(driver,device,NULL,devmode); + if (!icPrint) + icPrint = CreateIC(driver,device,NULL,devmode); + /* try once again. Adobe printer drivers sometimes need to be told everything twice */ + return icPrint; +} +#endif + +#define GetDeviceCapsWithDefault(icPrint, index, defaullt) (icPrint ? GetDeviceCaps(icPrint, index) : defaullt) + +void os_getpagedimensionsC( DEVMODE *devmode, char *device, char *driver, + int emulateScreenRes, + int *maxX, int *maxY, + int *leftPaper, int *topPaper, + int *rightPaper, int *bottomPaper, + int *xRes, int *yRes + ) +{ +#if 0 + HDC icPrint; + int horPaperPixels, verPaperPixels, + xResolution,yResolution, + scNX, scNY, scDX, scDY; + + + icPrint = myCreateIC(driver,device, devmode); + + xResolution = GetDeviceCapsWithDefault(icPrint, LOGPIXELSX, 300); + yResolution = GetDeviceCapsWithDefault(icPrint, LOGPIXELSY, 300); + if (emulateScreenRes) /* for emulation of the screen resolution */ + { + scNX = WinGetHorzResolution(); /* all the deviceCaps will be scaled */ + scNY = WinGetVertResolution(); + scDX = xResolution; + scDY = yResolution; + } + else + { scNX = 1; scNY = 1; scDX = 1; scDY = 1; }; + + horPaperPixels = (GetDeviceCapsWithDefault(icPrint, PHYSICALWIDTH, 2246)*scNX)/scDX; + verPaperPixels = (GetDeviceCapsWithDefault(icPrint, PHYSICALHEIGHT, 3250)*scNY)/scDY; + + *maxX = (GetDeviceCapsWithDefault(icPrint, HORZRES, 2241)*scNX)/scDX; + *maxY = (GetDeviceCapsWithDefault(icPrint, VERTRES, 3254)*scNY)/scDY; + + *leftPaper = (-GetDeviceCapsWithDefault(icPrint, PHYSICALOFFSETX, 116)*scNX)/scDX; + *topPaper = (-GetDeviceCapsWithDefault(icPrint, PHYSICALOFFSETY, 129)*scNY)/scDY; + *rightPaper = horPaperPixels - *leftPaper; + *bottomPaper = verPaperPixels - *topPaper; + + if (emulateScreenRes) + { *xRes = scNX; *yRes = scNY; } + else + { *xRes = xResolution ; *yRes = yResolution; }; + DeleteDC(icPrint); +#endif +} + +static HANDLE setupDevnames(int deviceLength,int driverLength,int outputLength, + char *device,char *driver,char *output) +{ + HANDLE hDevnames; +#if 0 + DEVNAMES *pDevnames; + hDevnames = (HANDLE) LocalAlloc(LMEM_MOVEABLE, 16+deviceLength+driverLength+outputLength); + pDevnames = LocalLock(hDevnames); + pDevnames->wDriverOffset = 16; + pDevnames->wDeviceOffset = 16+driverLength; + pDevnames->wOutputOffset = 16+driverLength+deviceLength; + pDevnames->wDefault = 0; + strcpy(((char*)pDevnames)+pDevnames->wDriverOffset, driver); + strcpy(((char*)pDevnames)+pDevnames->wDeviceOffset, device); + strcpy(((char*)pDevnames)+pDevnames->wOutputOffset, output); + LocalUnlock(hDevnames); +#endif + return hDevnames; +} + +static HANDLE setupDevmode(int size, char *pData) +{ + HANDLE hDevmode; +#if 0 + DEVMODE *pDevmode; + + hDevmode = (HANDLE) LocalAlloc(LMEM_MOVEABLE, size); + pDevmode = LocalLock(hDevmode); + memcpy((char*)pDevmode, pData, size); + LocalUnlock(hDevmode); +#endif + return hDevmode; +} + +void get_printSetup_with_PRINTDLG(PRINTDLG *pd, char **o_devmode, + char **o_device, char **o_driver, char **o_output) +{ +#if 0 + char *newDriver, *newDevice, *newOutput; + DEVMODE *pDevmode; + DEVNAMES *pDevnames; + + pDevmode = LocalLock(pd->hDevMode); + *o_devmode = g_strdup(pDevmode->dmDeviceName); + LocalUnlock(pd->hDevMode); + pDevnames = LocalLock(pd->hDevNames); + newDriver = ((char*)pDevnames)+(pDevnames->wDriverOffset); + newDevice = ((char*)pDevnames)+(pDevnames->wDeviceOffset); + newOutput = ((char*)pDevnames)+(pDevnames->wOutputOffset); + *o_driver = g_strdup(newDriver); + *o_device = g_strdup(newDevice); + *o_output = g_strdup(newOutput); + LocalUnlock(pd->hDevNames); +#endif +} + +/* PA: called in Clean. */ +int release_memory_handles(PRINTDLG *pd, int os) { +#if 0 + LocalFree(pd->hDevNames); + LocalFree(pd->hDevMode); +#endif + return os; + } + +/* + * This function hooks the Print dialog. It's purpose is to set the dialog in + * the foreground. + */ +static UINT APIENTRY DialogToFrontHook(HWND hdl, UINT msg, WPARAM wParam, LPARAM lParam) +{ +#if 0 + if (msg==WM_INITDIALOG) + { SetForegroundWindow(hdl); + }; +#endif + return FALSE; +} + +void printSetup(int calledFromCleanThread, int devmodeSize, + char *devmode, char *device, char *driver, char *output, + int *ok, PRINTDLG **pdPtr) +{ +#if 0 + int deviceLength, driverLength, outputLength; + HANDLE hDevnames,hDevmode; + static PRINTDLG pd; + + /* Set up DEVNAMES structure */ + + /*rMessageBox(NULL, MB_APPLMODAL, "in printSetup", ""); */ + deviceLength = strlen(device)+1; + driverLength = strlen(driver)+1; + outputLength = strlen(output)+1; + + hDevnames = setupDevnames(deviceLength,driverLength,outputLength,device,driver,output); + + /* Set up DEVMODE structure */ + hDevmode = setupDevmode(devmodeSize,devmode); + + /* Set up print dialog record */ + pd.lStructSize = sizeof(PRINTDLG); + pd.hwndOwner = calledFromCleanThread ? NULL : ghMainWindow; /* (NULL = desktop) */ +/* pd.hwndOwner = NULL; // (NULL = desktop) */ + /* + * The handle must belong to the active thread, otherwise PrintDlg + * will crash. When this function is called from the Clean thread, + * ghMainWindow will not belong to the active thread. + */ + pd.hDevMode = hDevmode; + pd.hDevNames = hDevnames; + pd.hDC = NULL; + pd.Flags = PD_PRINTSETUP | PD_ENABLESETUPHOOK; + pd.nFromPage = 1; + pd.nToPage = 1; + pd.nMinPage = 1; + pd.nMaxPage = USHRT_MAX; + pd.nCopies = 1; + pd.hInstance = NULL; + pd.lCustData = 0L; + pd.lpfnPrintHook = NULL; + pd.lpfnSetupHook = DialogToFrontHook; + pd.lpPrintTemplateName = NULL; + pd.lpSetupTemplateName = NULL; + pd.hPrintTemplate = NULL; + pd.hSetupTemplate = NULL; + + /* Open print dialog */ + *ok = PrintDlg(&pd); + *pdPtr = &pd; + + if (hDevnames!=pd.hDevNames) LocalFree(hDevnames); + if (hDevmode!=pd.hDevMode) LocalFree(hDevmode); +#endif +} + + +int startPage(int hdc) +{ +#if 0 + /*rMessageBox(NULL, MB_APPLMODAL, "in startPage", ""); */ + return StartPage((HDC) hdc) > 0; +#else + return 0; +#endif +} + +int endPage(int hdc) +{ +#if 0 + /*rMessageBox(NULL, MB_APPLMODAL, "in endPage", ""); */ + return EndPage((HDC) hdc) > 0; +#else + return 0; +#endif +} + +int startDoc(int hdc) + /* err code: >0:no error, <=0: user cancelled file dialog */ +{ +#if 0 + static DOCINFO docInfo = { sizeof (DOCINFO), "Clean", NULL, NULL, 0 } ; + + /*rMessageBox(NULL, MB_APPLMODAL, "in startDoc", "");*/ + bUserAbort = FALSE ; + + return StartDoc((HDC) hdc, &docInfo); +#else + return 0; +#endif +} + +void endDoc(int hdc) +{ +#if 0 + /*rMessageBox(NULL, MB_APPLMODAL, "in endDoc", ""); */ + if (bUserAbort) + AbortDoc((HDC) hdc); + else + EndDoc((HDC) hdc); +#endif +} + +void deleteDC(int hdc) +{ +#if 0 + /*rMessageBox(NULL, MB_APPLMODAL, "in deleteDC", ""); */ + DeleteDC((HDC) hdc); +#endif +} + +int wasCanceled(void) +{ +#if 0 + /*rMessageBox(NULL, MB_APPLMODAL, "in wasCanceled", ""); */ + return bUserAbort; +#else + return 0; +#endif +} + +/* getDC opens the print job dialog and + * lets the user change various settings or gets the default printer + */ + +/* c-strings are passed to this function ! */ +void getDC( int doDialog, int emulateScreen, int calledFromCleanThread, int devmodeLength, + char *devmode,char *device,char *driver,char *output, + int *err, + int *first, int *last, int *copies, + PRINTDLG **ppPrintDlg, + int *deviceContext + ) + /* err code: -1:no error, others: non fatal error */ +{ +#if 0 + static PRINTDLG pd; + HDC hdcPrint; + int ok; + + *err = -1; + + if (doDialog) + { /* Set up print dialog record */ + HANDLE hDevnames, hDevmode; + int deviceLength,driverLength,outputLength; + + deviceLength = strlen(device)+1; + driverLength = strlen(driver)+1; + outputLength = strlen(output)+1; + + hDevnames = setupDevnames(deviceLength,driverLength,outputLength, + device,driver,output); + hDevmode = setupDevmode(devmodeLength,devmode); + + pd.lStructSize = sizeof(PRINTDLG); + pd.hwndOwner = calledFromCleanThread ? NULL : ghMainWindow; /* (NULL = desktop) */ + /* + * The handle must belong to the active thread, otherwise PrintDlg + * will crash. When this function is called from the Clean thread, + * ghMainWindow will not belong to the active thread. + */ + pd.hDevMode = hDevmode; + pd.hDevNames = hDevnames; + pd.hDC = NULL; + pd.Flags = PD_ALLPAGES | PD_COLLATE | PD_RETURNDC | PD_NOSELECTION + | PD_ENABLEPRINTHOOK; + /* hide some options from print dialog */ + pd.nFromPage = 1; + pd.nToPage = 1; + pd.nMinPage = 1; + pd.nMaxPage = USHRT_MAX; + pd.nCopies = 1; + pd.hInstance = NULL; + pd.lCustData = 0L; + pd.lpfnPrintHook = DialogToFrontHook; + pd.lpfnSetupHook = NULL; + pd.lpPrintTemplateName = NULL; + pd.lpSetupTemplateName = NULL; + pd.hPrintTemplate = NULL; + pd.hSetupTemplate = NULL; + + /* Open print dialog */ + + ok = PrintDlg(&pd); + + if (hDevnames!=pd.hDevNames) LocalFree(hDevnames); + if (hDevmode!=pd.hDevMode) LocalFree(hDevmode); + + if (!ok) + { + *err = CommDlgExtendedError(); /* will return 0 iff user canceled, otherwise positive value */ + release_memory_handles(&pd, 0); + return; + } + + + if (pd.Flags & PD_PAGENUMS) + { *first = pd.nFromPage; + *last = pd.nToPage; + } + else + { *first = 1; + *last = 9999; + }; + *copies = pd.nCopies; + *ppPrintDlg = &pd; + hdcPrint = pd.hDC; + } + + else + + { + hdcPrint = CreateDC(driver, device, output, NULL); + if (hdcPrint==NULL) + { *err = 0; /* non fatal error, iff e.g. no printer driver is installed */ + return; + }; + *first = 1; + *last = 9999; + *copies = 1; + *ppPrintDlg = NULL; + }; + + if (emulateScreen) + { int pXdpi,pYdpi,sXdpi,sYdpi; + pXdpi = GetDeviceCaps(hdcPrint, LOGPIXELSX); + pYdpi = GetDeviceCaps(hdcPrint, LOGPIXELSY); + sXdpi = WinGetHorzResolution(); + sYdpi = WinGetVertResolution(); + SetMapMode(hdcPrint, MM_ISOTROPIC); + SetWindowExtEx (hdcPrint,sXdpi, sYdpi, NULL); + SetViewportExtEx(hdcPrint,pXdpi, pYdpi, NULL); + }; + + *deviceContext = (int) hdcPrint; + /*rMessageBox(NULL, MB_APPLMODAL, "leaving getDC","");*/ +#endif +} + + +#if 0 +BOOL CALLBACK PrintDlgProc (HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam) + { + switch (msg) + { + case WM_INITDIALOG : + EnableMenuItem (GetSystemMenu (hDlg, FALSE), SC_CLOSE, + MF_GRAYED) ; + return TRUE ; + case WM_COMMAND : + bUserAbort = TRUE ; + EnableWindow (ghMainWindow, TRUE) ; + DestroyWindow (hDlg) ; + hDlgPrint = 0 ; + return TRUE ; + } + return FALSE; + } + +BOOL CALLBACK AbortProc (HDC hdcPrn, int iCode) + { + MSG msg ; + + while (!bUserAbort && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) + { + if (!hDlgPrint || !IsDialogMessage (hDlgPrint, &msg)) + { + TranslateMessage (&msg) ; + DispatchMessage (&msg) ; + } + } + return !bUserAbort ; + } +#endif + + +#define DIALOG_WIDTH 100 +#define DIALOG_HEIGHT 60 + /* in dialog units */ + +#if 0 +HWND CreateCancelDialog(void) +{ + HWND hwndButton,dlgHdl; + + WORD *p, *pdlgtemplate,baseunitX,baseunitY; + int nchar; + int scrnWidth,scrnHeight; + int buttonX, buttonY, buttonWidth, buttonHeight; + int textX, textY, textWidth, textHeight; + DWORD lStyle,baseunits; + HDC screen; + LOGFONT lf; + + /* allocate some memory to play with */ + pdlgtemplate = p = (PWORD) rmalloc (1000); + + screen = CreateDC ("DISPLAY", NULL, NULL, NULL); + scrnWidth = GetDeviceCaps (screen, HORZRES); + scrnHeight = GetDeviceCaps (screen, VERTRES); + DeleteDC (screen); + baseunits = GetDialogBaseUnits(); + + /* start to fill in the dlgtemplate information. addressing by WORDs */ + lStyle = WS_CAPTION | DS_MODALFRAME | WS_SYSMENU; + + baseunitX=LOWORD(baseunits); + baseunitY=HIWORD(baseunits); + + *p++ = LOWORD (lStyle); + *p++ = HIWORD (lStyle); + *p++ = 0; /* LOWORD (lExtendedStyle) */ + *p++ = 0; /* HIWORD (lExtendedStyle) */ + *p++ = 0; /* NumberOfItems */ + *p++ = ((scrnWidth*4)/3)/baseunitX; /* x */ + *p++ = ((scrnHeight*8)/3)/baseunitY; /* y */ + *p++ = DIALOG_WIDTH; /* cx */ + *p++ = DIALOG_HEIGHT; /* cy */ + *p++ = 0; /* Menu */ + *p++ = 0; /* Class */ + + /* copy the title of the dialog */ + nchar = NULL; /*nCopyAnsiToWideChar (p, (char *) "Printing in Progress");*/ + p += nchar; + + dlgHdl = CreateDialogIndirectParam (ghInst, (LPDLGTEMPLATE) pdlgtemplate, ghMainWindow, + (DLGPROC) PrintDlgProc, (LPARAM) 0); + + rfree(pdlgtemplate); + + /* Add a text field */ + textWidth = 19*baseunitX; + textHeight = baseunitY; + textX = (((DIALOG_WIDTH*baseunitX)/4) - textWidth) + / 2; + textY = (((DIALOG_HEIGHT*baseunitY)/8) - textHeight) + / 4; + hwndText = CreateWindow ("static", "",WS_VISIBLE | WS_CHILD | SS_CENTER, + textX, textY, textWidth, textHeight, + dlgHdl, (HMENU) 0, ghInst, 0); + + + /* Add a Cancel button: */ + buttonWidth = 10*baseunitX; + buttonHeight = (3*baseunitY)/2; + buttonX = (((DIALOG_WIDTH*baseunitX)/4) - buttonWidth) + / 2; + buttonY = (3 * (((DIALOG_HEIGHT*baseunitY)/8) - buttonHeight)) + / 5; + hwndButton = CreateWindow ("button", "Cancel", WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON, + buttonX, buttonY, buttonWidth, buttonHeight, + dlgHdl, (HMENU) 0, ghInst, 0); +/* WinSetFont (&lf,"MS Sans Serif",0,8); */ + SendMessage(hwndButton,WM_SETFONT,(WPARAM)CreateFontIndirect (&lf),MAKELPARAM (TRUE,0)); + SendMessage(hwndText,WM_SETFONT,(WPARAM)CreateFontIndirect (&lf),MAKELPARAM (TRUE,0)); + + ShowWindow (dlgHdl,SW_SHOWNORMAL); + return dlgHdl; +} +#endif + +/* PA: Called in Clean. */ +int addSemaphor(int add) +{ + int old=semaphor; + semaphor+=add; + return old; +} + +int os_printsetupvalidC(DEVMODE *devmode, char *device, char *driver) +{ +#if 0 + HDC icPrint; + + icPrint = myCreateIC(driver,device,devmode); + if (icPrint) + DeleteDC(icPrint); + return icPrint!=NULL; +#else + return 0; +#endif +} + -- cgit v1.2.3