Annotation of OpenXM_contrib/gnuplot/win/wprinter.c, Revision 1.1
1.1 ! maekawa 1: #ifndef lint
! 2: static char *RCSid = "$Id: wprinter.c,v 1.11 1998/03/22 23:32:02 drd Exp $";
! 3: #endif
! 4:
! 5: /* GNUPLOT - win/wprinter.c */
! 6: /*[
! 7: * Copyright 1992, 1993, 1998 Maurice Castro, Russell Lang
! 8: *
! 9: * Permission to use, copy, and distribute this software and its
! 10: * documentation for any purpose with or without fee is hereby granted,
! 11: * provided that the above copyright notice appear in all copies and
! 12: * that both that copyright notice and this permission notice appear
! 13: * in supporting documentation.
! 14: *
! 15: * Permission to modify the software is granted, but not the right to
! 16: * distribute the complete modified source code. Modifications are to
! 17: * be distributed as patches to the released version. Permission to
! 18: * distribute binaries produced by compiling modified sources is granted,
! 19: * provided you
! 20: * 1. distribute the corresponding source modifications from the
! 21: * released version in the form of a patch file along with the binaries,
! 22: * 2. add special version identification to distinguish your version
! 23: * in addition to the base release version number,
! 24: * 3. provide your name and address as the primary contact for the
! 25: * support of your modified version, and
! 26: * 4. retain our contact information in regard to use of the base
! 27: * software.
! 28: * Permission to distribute the released version of the source code along
! 29: * with corresponding source modifications in the form of a patch file is
! 30: * granted with same provisions 2 through 4 for binary distributions.
! 31: *
! 32: * This software is provided "as is" without express or implied warranty
! 33: * to the extent permitted by applicable law.
! 34: ]*/
! 35:
! 36: /*
! 37: * AUTHORS
! 38: *
! 39: * Maurice Castro
! 40: * Russell Lang
! 41: *
! 42: * Send your comments or suggestions to
! 43: * info-gnuplot@dartmouth.edu.
! 44: * This is a mailing list; to join it send a note to
! 45: * majordomo@dartmouth.edu.
! 46: * Send bug reports to
! 47: * bug-gnuplot@dartmouth.edu.
! 48: */
! 49:
! 50: /* Dump a file to the printer */
! 51:
! 52: #define STRICT
! 53: #include <windows.h>
! 54: #include <windowsx.h>
! 55: #if WINVER >= 0x030a
! 56: #include <commdlg.h>
! 57: #endif
! 58: #ifdef WIN32
! 59: #include <stdio.h>
! 60: #include <stdlib.h>
! 61: #endif
! 62: #ifdef __MSC__
! 63: #include <memory.h>
! 64: #else
! 65: #include <mem.h>
! 66: #endif
! 67: #include "wgnuplib.h"
! 68: #include "wresourc.h"
! 69: #include "wcommon.h"
! 70:
! 71: LPPRINT prlist = NULL;
! 72:
! 73: BOOL CALLBACK WINEXPORT PrintSizeDlgProc(HWND hdlg, UINT wmsg, WPARAM wparam, LPARAM lparam);
! 74: BOOL CALLBACK WINEXPORT
! 75: PrintSizeDlgProc(HWND hdlg, UINT wmsg, WPARAM wparam, LPARAM lparam)
! 76: {
! 77: char buf[8];
! 78: LPPRINT lpr;
! 79: lpr = (LPPRINT)GetWindowLong(GetParent(hdlg), 4);
! 80:
! 81: switch (wmsg) {
! 82: case WM_INITDIALOG:
! 83: wsprintf(buf,"%d",lpr->pdef.x);
! 84: SetDlgItemText(hdlg, PSIZE_DEFX, buf);
! 85: wsprintf(buf,"%d",lpr->pdef.y);
! 86: SetDlgItemText(hdlg, PSIZE_DEFY, buf);
! 87: wsprintf(buf,"%d",lpr->poff.x);
! 88: SetDlgItemText(hdlg, PSIZE_OFFX, buf);
! 89: wsprintf(buf,"%d",lpr->poff.y);
! 90: SetDlgItemText(hdlg, PSIZE_OFFY, buf);
! 91: wsprintf(buf,"%d",lpr->psize.x);
! 92: SetDlgItemText(hdlg, PSIZE_X, buf);
! 93: wsprintf(buf,"%d",lpr->psize.y);
! 94: SetDlgItemText(hdlg, PSIZE_Y, buf);
! 95: CheckDlgButton(hdlg, PSIZE_DEF, TRUE);
! 96: EnableWindow(GetDlgItem(hdlg, PSIZE_X), FALSE);
! 97: EnableWindow(GetDlgItem(hdlg, PSIZE_Y), FALSE);
! 98: return TRUE;
! 99: case WM_COMMAND:
! 100: switch (wparam) {
! 101: case PSIZE_DEF:
! 102: EnableWindow(GetDlgItem(hdlg, PSIZE_X), FALSE);
! 103: EnableWindow(GetDlgItem(hdlg, PSIZE_Y), FALSE);
! 104: return FALSE;
! 105: case PSIZE_OTHER:
! 106: EnableWindow(GetDlgItem(hdlg, PSIZE_X), TRUE);
! 107: EnableWindow(GetDlgItem(hdlg, PSIZE_Y), TRUE);
! 108: return FALSE;
! 109: case IDOK:
! 110: if (SendDlgItemMessage(hdlg, PSIZE_OTHER, BM_GETCHECK, 0, 0L)) {
! 111: SendDlgItemMessage(hdlg, PSIZE_X, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
! 112: GetInt(buf, (LPINT)&lpr->psize.x);
! 113: SendDlgItemMessage(hdlg, PSIZE_Y, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
! 114: GetInt(buf, (LPINT)&lpr->psize.y);
! 115: }
! 116: else {
! 117: lpr->psize.x = lpr->pdef.x;
! 118: lpr->psize.y = lpr->pdef.y;
! 119: }
! 120: SendDlgItemMessage(hdlg, PSIZE_OFFX, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
! 121: GetInt(buf, (LPINT)&lpr->poff.x);
! 122: SendDlgItemMessage(hdlg, PSIZE_OFFY, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
! 123: GetInt(buf, (LPINT)&lpr->poff.y);
! 124:
! 125: if (lpr->psize.x <= 0)
! 126: lpr->psize.x = lpr->pdef.x;
! 127: if (lpr->psize.y <= 0)
! 128: lpr->psize.y = lpr->pdef.y;
! 129:
! 130: EndDialog(hdlg, IDOK);
! 131: return TRUE;
! 132: case IDCANCEL:
! 133: EndDialog(hdlg, IDCANCEL);
! 134: return TRUE;
! 135: }
! 136: break;
! 137: }
! 138: return FALSE;
! 139: }
! 140:
! 141:
! 142:
! 143: /* GetWindowLong(hwnd, 4) must be available for use */
! 144: BOOL
! 145: PrintSize(HDC printer, HWND hwnd, LPRECT lprect)
! 146: {
! 147: HDC hdc;
! 148: DLGPROC lpfnPrintSizeDlgProc ;
! 149: BOOL status = FALSE;
! 150: PRINT pr;
! 151:
! 152: SetWindowLong(hwnd, 4, (LONG)((LPPRINT)&pr));
! 153: pr.poff.x = 0;
! 154: pr.poff.y = 0;
! 155: pr.psize.x = GetDeviceCaps(printer, HORZSIZE);
! 156: pr.psize.y = GetDeviceCaps(printer, VERTSIZE);
! 157: hdc = GetDC(hwnd);
! 158: GetClientRect(hwnd,lprect);
! 159: pr.pdef.x = MulDiv(lprect->right-lprect->left, 254, 10*GetDeviceCaps(hdc, LOGPIXELSX));
! 160: pr.pdef.y = MulDiv(lprect->bottom-lprect->top, 254, 10*GetDeviceCaps(hdc, LOGPIXELSX));
! 161: ReleaseDC(hwnd,hdc);
! 162: #ifdef WIN32
! 163: if (DialogBox (hdllInstance, "PrintSizeDlgBox", hwnd, PrintSizeDlgProc)
! 164: #else
! 165: #ifdef __DLL__
! 166: lpfnPrintSizeDlgProc = (DLGPROC)GetProcAddress(hdllInstance, "PrintSizeDlgProc");
! 167: #else
! 168: lpfnPrintSizeDlgProc = (DLGPROC)MakeProcInstance((FARPROC)PrintSizeDlgProc, hdllInstance);
! 169: #endif
! 170: if (DialogBox (hdllInstance, "PrintSizeDlgBox", hwnd, lpfnPrintSizeDlgProc)
! 171: #endif
! 172: == IDOK) {
! 173: lprect->left = MulDiv(pr.poff.x*10, GetDeviceCaps(printer, LOGPIXELSX), 254);
! 174: lprect->top = MulDiv(pr.poff.y*10, GetDeviceCaps(printer, LOGPIXELSY), 254);
! 175: lprect->right = lprect->left + MulDiv(pr.psize.x*10, GetDeviceCaps(printer, LOGPIXELSX), 254);
! 176: lprect->bottom = lprect->top + MulDiv(pr.psize.y*10, GetDeviceCaps(printer, LOGPIXELSY), 254);
! 177: status = TRUE;
! 178: }
! 179: #ifndef WIN32
! 180: #ifndef __DLL__
! 181: FreeProcInstance((FARPROC)lpfnPrintSizeDlgProc);
! 182: #endif
! 183: #endif
! 184: SetWindowLong(hwnd, 4, (LONG)(0L));
! 185:
! 186: return status;
! 187: }
! 188:
! 189: #ifdef WIN32
! 190: /* Win32 doesn't support OpenJob() etc. so we must use some old code
! 191: * which attempts to sneak the output through a Windows printer driver */
! 192: void
! 193: PrintRegister(LPPRINT lpr)
! 194: {
! 195: LPPRINT next;
! 196: next = prlist;
! 197: prlist = lpr;
! 198: lpr->next = next;
! 199: }
! 200:
! 201: LPPRINT
! 202: PrintFind(HDC hdc)
! 203: {
! 204: LPPRINT this;
! 205: this = prlist;
! 206: while (this && (this->hdcPrn!=hdc)) {
! 207: this = this->next;
! 208: }
! 209: return this;
! 210: }
! 211:
! 212: void
! 213: PrintUnregister(LPPRINT lpr)
! 214: {
! 215: LPPRINT this, prev;
! 216: prev = (LPPRINT)NULL;
! 217: this = prlist;
! 218: while (this && (this!=lpr)) {
! 219: prev = this;
! 220: this = this->next;
! 221: }
! 222: if (this && (this == lpr)) {
! 223: /* unhook it */
! 224: if (prev)
! 225: prev->next = this->next;
! 226: else
! 227: prlist = this->next;
! 228: }
! 229: }
! 230:
! 231:
! 232: /* GetWindowLong(GetParent(hDlg), 4) must be available for use */
! 233: BOOL CALLBACK WINEXPORT
! 234: PrintDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
! 235: {
! 236: LPPRINT lpr;
! 237: lpr = (LPPRINT)GetWindowLong(GetParent(hDlg), 4);
! 238:
! 239: switch(message) {
! 240: case WM_INITDIALOG:
! 241: lpr->hDlgPrint = hDlg;
! 242: SetWindowText(hDlg,(LPSTR)lParam);
! 243: EnableMenuItem(GetSystemMenu(hDlg,FALSE),SC_CLOSE,MF_GRAYED);
! 244: return TRUE;
! 245: case WM_COMMAND:
! 246: lpr->bUserAbort = TRUE;
! 247: lpr->hDlgPrint = 0;
! 248: EnableWindow(GetParent(hDlg),TRUE);
! 249: EndDialog(hDlg, FALSE);
! 250: return TRUE;
! 251: }
! 252: return FALSE;
! 253: }
! 254:
! 255:
! 256: BOOL CALLBACK WINEXPORT
! 257: PrintAbortProc(HDC hdcPrn, int code)
! 258: {
! 259: MSG msg;
! 260: LPPRINT lpr;
! 261: lpr = PrintFind(hdcPrn);
! 262:
! 263: while (!lpr->bUserAbort && PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
! 264: if (!lpr->hDlgPrint || !IsDialogMessage(lpr->hDlgPrint,&msg)) {
! 265: TranslateMessage(&msg);
! 266: DispatchMessage(&msg);
! 267: }
! 268: }
! 269: return(!lpr->bUserAbort);
! 270: }
! 271:
! 272:
! 273: /* GetWindowLong(hwnd, 4) must be available for use */
! 274: void WDPROC
! 275: DumpPrinter(HWND hwnd, LPSTR szAppName, LPSTR szFileName)
! 276: {
! 277: HDC printer;
! 278: PRINTDLG pd;
! 279: PRINT pr;
! 280: DOCINFO di;
! 281: char *buf;
! 282: WORD *bufcount;
! 283: int count;
! 284: FILE *f;
! 285: long lsize;
! 286: long ldone;
! 287: char pcdone[10];
! 288:
! 289: memset(&pd, 0, sizeof(PRINTDLG));
! 290: pd.lStructSize = sizeof(PRINTDLG);
! 291: pd.hwndOwner = hwnd;
! 292: pd.Flags = PD_PRINTSETUP | PD_RETURNDC;
! 293:
! 294: if ((f = fopen(szFileName, "rb")) == (FILE *)NULL)
! 295: return;
! 296: fseek(f, 0L, SEEK_END);
! 297: lsize = ftell(f);
! 298: if (lsize <= 0)
! 299: lsize = 1;
! 300: fseek(f, 0L, SEEK_SET);
! 301: ldone = 0;
! 302:
! 303: if (PrintDlg(&pd)) {
! 304: printer = pd.hDC;
! 305: if (printer != (HDC)NULL) {
! 306: pr.hdcPrn = printer;
! 307: SetWindowLong(hwnd, 4, (LONG)((LPPRINT)&pr));
! 308: PrintRegister((LPPRINT)&pr);
! 309: if ( (buf = malloc(4096+2)) != (char *)NULL ) {
! 310: bufcount = (WORD *)buf;
! 311: EnableWindow(hwnd,FALSE);
! 312: pr.bUserAbort = FALSE;
! 313: /* is parent set correctly */
! 314: pr.hDlgPrint = CreateDialogParam(hdllInstance,"CancelDlgBox",hwnd,PrintDlgProc,(LPARAM)szAppName);
! 315: SetAbortProc(printer, PrintAbortProc);
! 316: di.cbSize = sizeof(DOCINFO);
! 317: di.lpszDocName = szAppName;
! 318: di.lpszOutput = NULL;
! 319: if (StartDoc(printer, &di) > 0) {
! 320: while ( pr.hDlgPrint && !pr.bUserAbort
! 321: && (count = fread(buf+2, 1, 4096, f)) != 0 ) {
! 322: *bufcount = count;
! 323: Escape(printer, PASSTHROUGH, count+2, (LPSTR)buf, NULL);
! 324: ldone += count;
! 325: sprintf(pcdone, "%d%% done", (int)(ldone * 100 / lsize));
! 326: SetWindowText(GetDlgItem(pr.hDlgPrint, CANCEL_PCDONE), pcdone);
! 327: if (pr.bUserAbort)
! 328: AbortDoc(printer);
! 329: else
! 330: EndDoc(printer);
! 331: }
! 332: if (!pr.bUserAbort) {
! 333: EnableWindow(hwnd,TRUE);
! 334: DestroyWindow(pr.hDlgPrint);
! 335: }
! 336: free(buf);
! 337: }
! 338: }
! 339: DeleteDC(printer);
! 340: SetWindowLong(hwnd, 4, (LONG)(0L));
! 341: PrintUnregister((LPPRINT)&pr);
! 342: }
! 343: }
! 344: fclose(f);
! 345: }
! 346:
! 347:
! 348: #else /* !WIN32 */
! 349: /* documented in Device Driver Adaptation Guide */
! 350: /* Prototypes taken from print.h */
! 351: DECLARE_HANDLE(HPJOB);
! 352:
! 353: HPJOB WINAPI OpenJob(LPSTR, LPSTR, HPJOB);
! 354: int WINAPI StartSpoolPage(HPJOB);
! 355: int WINAPI EndSpoolPage(HPJOB);
! 356: int WINAPI WriteSpool(HPJOB, LPSTR, int);
! 357: int WINAPI CloseJob(HPJOB);
! 358: int WINAPI DeleteJob(HPJOB, int);
! 359: int WINAPI WriteDialog(HPJOB, LPSTR, int);
! 360: int WINAPI DeleteSpoolPage(HPJOB);
! 361:
! 362: /* Modeless dialog box - Cancel printing */
! 363: BOOL CALLBACK WINEXPORT
! 364: CancelDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
! 365: {
! 366: switch(message) {
! 367: case WM_INITDIALOG:
! 368: SetWindowText(hDlg,(LPSTR)lParam);
! 369: return TRUE;
! 370: case WM_COMMAND:
! 371: switch(LOWORD(wParam)) {
! 372: case IDCANCEL:
! 373: DestroyWindow(hDlg);
! 374: return TRUE;
! 375: }
! 376: }
! 377: return FALSE;
! 378: }
! 379:
! 380:
! 381:
! 382: /* Dialog box to select printer port */
! 383: BOOL CALLBACK WINEXPORT
! 384: SpoolDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
! 385: {
! 386: LPSTR entry;
! 387: switch(message) {
! 388: case WM_INITDIALOG:
! 389: entry = (LPSTR)lParam;
! 390: while (*entry) {
! 391: SendDlgItemMessage(hDlg, SPOOL_PORT, LB_ADDSTRING, 0, (LPARAM)entry);
! 392: entry += lstrlen(entry)+1;
! 393: }
! 394: SendDlgItemMessage(hDlg, SPOOL_PORT, LB_SETCURSEL, 0, (LPARAM)0);
! 395: return TRUE;
! 396: case WM_COMMAND:
! 397: switch(LOWORD(wParam)) {
! 398: case SPOOL_PORT:
! 399: if (HIWORD(lParam) == LBN_DBLCLK)
! 400: PostMessage(hDlg, WM_COMMAND, IDOK, 0L);
! 401: return FALSE;
! 402: case IDOK:
! 403: EndDialog(hDlg, 1+(int)SendDlgItemMessage(hDlg, SPOOL_PORT, LB_GETCURSEL, 0, 0L));
! 404: return TRUE;
! 405: case IDCANCEL:
! 406: EndDialog(hDlg, 0);
! 407: return TRUE;
! 408: }
! 409: }
! 410: return FALSE;
! 411: }
! 412:
! 413: /* Print File to port */
! 414: void WDPROC
! 415: DumpPrinter(HWND hwnd, LPSTR szAppName, LPSTR szFileName)
! 416: {
! 417: #define PRINT_BUF_SIZE 4096
! 418: char *buffer;
! 419: char *portname;
! 420: int i, iport;
! 421: DLGPROC lpfnSpoolProc;
! 422: HPJOB hJob;
! 423: UINT count;
! 424: HFILE hf;
! 425: int error = FALSE;
! 426: DLGPROC lpfnCancelProc;
! 427: long lsize;
! 428: long ldone;
! 429: char pcdone[10];
! 430: MSG msg;
! 431: HWND hDlgModeless;
! 432:
! 433: if ((buffer = LocalAllocPtr(LHND, PRINT_BUF_SIZE)) == (char *)NULL)
! 434: return;
! 435: /* get list of ports */
! 436: GetProfileString("ports", NULL, "", buffer, PRINT_BUF_SIZE);
! 437: /* select a port */
! 438: lpfnSpoolProc = (DLGPROC)MakeProcInstance((FARPROC)SpoolDlgProc, hdllInstance);
! 439: iport = DialogBoxParam(hdllInstance, "SpoolDlgBox", hwnd, lpfnSpoolProc, (LPARAM)buffer);
! 440: FreeProcInstance((FARPROC)lpfnSpoolProc);
! 441: if (!iport) {
! 442: LocalFreePtr((void NEAR *)buffer);
! 443: return;
! 444: }
! 445: portname = buffer;
! 446: for (i=1; i<iport && lstrlen(portname)!=0; i++)
! 447: portname += lstrlen(portname)+1;
! 448:
! 449: /* open file and get length */
! 450: hf = _lopen(szFileName, OF_READ);
! 451: if (hf == HFILE_ERROR) {
! 452: LocalFreePtr((void NEAR *)buffer);
! 453: return;
! 454: }
! 455: lsize = _llseek(hf, 0L, 2);
! 456: (void)_llseek(hf, 0L, 0);
! 457: if (lsize <= 0)
! 458: lsize = 1;
! 459:
! 460: hJob = OpenJob(portname, szFileName, (HDC)NULL);
! 461: switch ((int)hJob) {
! 462: case SP_APPABORT:
! 463: case SP_ERROR:
! 464: case SP_OUTOFDISK:
! 465: case SP_OUTOFMEMORY:
! 466: case SP_USERABORT:
! 467: _lclose(hf);
! 468: LocalFreePtr((void NEAR *)buffer);
! 469: return;
! 470: }
! 471: if (StartSpoolPage(hJob) < 0)
! 472: error = TRUE;
! 473:
! 474: ldone = 0;
! 475: lpfnCancelProc = (DLGPROC)MakeProcInstance((FARPROC)CancelDlgProc, hdllInstance);
! 476: hDlgModeless = CreateDialogParam(hdllInstance, "CancelDlgBox", hwnd, lpfnCancelProc, (LPARAM)szAppName);
! 477:
! 478: while (!error && hDlgModeless && IsWindow(hDlgModeless)
! 479: && ((count = _lread(hf, buffer, PRINT_BUF_SIZE))!= 0) ) {
! 480: wsprintf(pcdone, "%d%% done", (int)(ldone * 100 / lsize));
! 481: SetWindowText(GetDlgItem(hDlgModeless, CANCEL_PCDONE), pcdone);
! 482: if (WriteSpool(hJob, buffer, count) < 0)
! 483: error = TRUE;
! 484: ldone += count;
! 485: while (IsWindow(hDlgModeless) && PeekMessage(&msg, hDlgModeless, 0, 0, PM_REMOVE)) {
! 486: if (!IsDialogMessage(hDlgModeless, &msg)) {
! 487: TranslateMessage(&msg);
! 488: DispatchMessage(&msg);
! 489: }
! 490: }
! 491: }
! 492: LocalFreePtr((void NEAR *)buffer);
! 493: _lclose(hf);
! 494:
! 495: if (!hDlgModeless || !IsWindow(hDlgModeless))
! 496: error=TRUE;
! 497: if (IsWindow(hDlgModeless))
! 498: DestroyWindow(hDlgModeless);
! 499: hDlgModeless = 0;
! 500: FreeProcInstance((FARPROC)lpfnCancelProc);
! 501: EndSpoolPage(hJob);
! 502: if (error)
! 503: DeleteJob(hJob, 0);
! 504: else
! 505: CloseJob(hJob);
! 506: }
! 507: #endif /* !WIN32 */
! 508:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>