source: trunk/dll/printer.c@ 1570

Last change on this file since 1570 was 1544, checked in by Gregg Young, 15 years ago

Changes to fopen and _fsopen to allow FM2 to be loaded in high memory

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.0 KB
Line 
1/***********************************************************************
2
3 $Id: printer.c 1544 2010-09-30 13:00:59Z gyoung $
4
5 Print file list
6
7 Copyright (c) 1993-98 M. Kimes
8 Copyright (c) 2004, 2010 Steven H.Levine
9
10 01 Aug 04 SHL Rework lstrip/rstrip usage
11 17 Jul 06 SHL Use Runtime_Error
12 03 Nov 06 SHL Renames
13 03 Nov 06 SHL Count thread usage
14 22 Mar 07 GKY Use QWL_USER
15 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
16 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
17 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
18
19***********************************************************************/
20
21#include <stdlib.h>
22#include <string.h>
23#include <ctype.h>
24#include <share.h>
25
26#define INCL_DOS
27#define INCL_WIN
28#define INCL_LONGLONG // dircnrs.h
29
30#include "fm3dll.h"
31#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
32#include "notebook.h" // Data declaration(s)
33#include "mainwnd.h" // Data declaration(s)
34#include "init.h" // Data declaration(s)
35#include "fm3dlg.h"
36#include "fm3str.h"
37#include "makelist.h" // AddToList
38#include "errutil.h" // Dos_Error...
39#include "strutil.h" // GetPString
40#include "notify.h" // AddNote
41#include "defview.h" // QuickView
42#include "printer.h"
43#include "common.h" // DecrThreadUsage, IncrThreadUsage
44#include "chklist.h" // PosOverOkay
45#include "strips.h" // bstrip
46#include "valid.h" // IsFile
47#include "wrappers.h" // xfopen
48#include "misc.h" // PostMsg
49#include "fortify.h"
50
51// Data definitions
52#pragma data_seg(DATA1)
53
54static PSZ pszSrcFile = __FILE__;
55
56static HMTX PrintSem = 0;
57
58static BOOL PrinterReady(CHAR * printdevname);
59static BOOL SayPrinterReady(HWND hwnd);
60
61#pragma data_seg(GLOBAL2)
62CHAR StopPrinting;
63CHAR printer[CCHMAXPATH];
64BOOL prnalt;
65long prnbmargin;
66BOOL prnformat;
67BOOL prnformfeedafter;
68BOOL prnformfeedbefore;
69long prnlength;
70long prnlmargin;
71BOOL prnpagenums;
72long prnrmargin;
73long prnspacing;
74long prntabspaces;
75long prntmargin;
76long prnwidth;
77
78BOOL PrinterReady(CHAR * printdevname)
79{
80 FILE *printhandle;
81 CHAR param = 0, data = 0;
82 ULONG datalen = 1, parmlen = 1, htype, flagword;
83 CHAR *modea = "a+";
84
85 if (!fWorkPlace) /* assume spooler is active */
86 return TRUE;
87 DosError(FERR_DISABLEHARDERR);
88 printhandle = xfopen(printdevname, modea, pszSrcFile, __LINE__, FALSE);
89 if (printhandle) {
90 if (!strnicmp(printdevname, "COM", 3) && isdigit(printdevname[3])) {
91 fclose(printhandle);
92 return TRUE;
93 }
94 if (!DosQueryHType(fileno(printhandle), &htype, &flagword) &&
95 !(htype & 7)) {
96 fclose(printhandle);
97 return TRUE;
98 }
99 if (DosDevIOCtl(fileno(printhandle), 5, 0x00000066, (PVOID) & param,
100 1, &parmlen, (PVOID) & data, 1,
101 &datalen) != 0x00000100) {
102 fclose(printhandle);
103 return FALSE;
104 }
105 fclose(printhandle);
106 if (data & 32) /* bit 5 is out of paper */
107 return FALSE;
108 return TRUE;
109 }
110 return FALSE;
111}
112
113BOOL SayPrinterReady(HWND hwnd)
114{
115 if (!hwnd)
116 hwnd = HWND_DESKTOP;
117 if (!PrinterReady(printer)) {
118 saymsg(MB_ENTER | MB_ICONEXCLAMATION,
119 hwnd,
120 GetPString(IDS_NOTETEXT), GetPString(IDS_PRINTERNOTREADYTEXT));
121 return FALSE;
122 }
123 return TRUE;
124}
125
126//=== PrintListThread - background-print a list of files ===
127
128VOID PrintListThread(VOID * arg)
129{
130 HAB hab2;
131 HMQ hmq2;
132 LISTINFO *li = (LISTINFO *) arg;
133 register INT x;
134 FILE *fpi, *fpo;
135 CHAR s[CCHMAXPATH + 80];
136 FILESTATUS3 fs3;
137 LONG cols, lines, pages, z, lmargin, rmargin;
138 BOOL endline, endpage, startpage, skipping, firstpass;
139 int c;
140 APIRET rc = MBID_YES;
141 CHAR *mode;
142
143 if (StopPrinting)
144 goto Abort;
145 if (!PrintSem) {
146 if (DosCreateMutexSem(NULL, &PrintSem, 0, FALSE)) {
147 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
148 PCSZ_DOSCREATEMUTEXSEM);
149 goto Abort;
150 }
151 }
152# ifdef FORTIFY
153 Fortify_EnterScope();
154# endif
155 priority_normal();
156 hab2 = WinInitialize(0);
157 if (hab2) {
158 hmq2 = WinCreateMsgQueue(hab2, 0);
159 if (hmq2) {
160 WinCancelShutdown(hmq2, TRUE);
161 IncrThreadUsage();
162 if (li && li->list && li->list[0]) {
163 AddNote(GetPString(IDS_PRINTINGLISTTEXT));
164 for (x = 0; li->list[x]; x++) {
165 if (rc == MBID_CANCEL)
166 break;
167 DosError(FERR_DISABLEHARDERR);
168 if (DosQueryPathInfo(li->list[x], FIL_STANDARD, &fs3, sizeof(fs3)) ||
169 fs3.attrFile & FILE_DIRECTORY ||
170 !fs3.cbFile)
171 continue;
172 if (StopPrinting)
173 break;
174 DosRequestMutexSem(PrintSem, 240000);
175 if (StopPrinting)
176 break;
177 if (!PrinterReady(li->targetpath))
178 Runtime_Error(pszSrcFile, __LINE__, "printer %s error",
179 li->targetpath);
180 else {
181 mode = "r";
182 fpi = xfsopen(li->list[x], mode, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
183 if (!fpi)
184 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
185 li->list[x]);
186 else {
187 mode = "a+";
188 fpo = xfsopen(li->targetpath, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
189 if (!fpo)
190 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
191 li->targetpath);
192 else {
193 sprintf(s, GetPString(IDS_PRINTINGTEXT), li->list[x]);
194 AddNote(s);
195 firstpass = TRUE;
196 skipping = FALSE;
197 lmargin = prnlmargin;
198 rmargin = prnrmargin;
199 if (prnformfeedbefore) {
200 if (!skipping)
201 fputc('\x0c', fpo);
202 }
203 Again:
204 cols = lines = pages = 0;
205 endline = endpage = FALSE;
206 startpage = TRUE;
207 while ((c = fgetc(fpi)) != EOF) {
208 if (StopPrinting || ferror(fpo))
209 break;
210 if (prnformat) {
211 if (startpage) {
212 pages++;
213 if (prnpagenums) {
214 if (!skipping)
215 fprintf(fpo, "%*.*s#%lu",
216 lmargin, lmargin, " ", pages);
217 }
218 for (z = 0; z < prntmargin; z++) {
219 if (!skipping)
220 fputc('\n', fpo);
221 }
222 lines = prntmargin;
223 endline = endpage = FALSE;
224 cols = 0;
225 startpage = FALSE;
226 }
227 if (!cols) {
228 for (z = 0; z < lmargin; z++) {
229 if (!skipping)
230 fputc(' ', fpo);
231 }
232 cols = lmargin;
233 }
234 if (!skipping) {
235 if (c == '\t') {
236 for (z = 0; z < prntabspaces &&
237 cols + z < prnwidth - rmargin; z++)
238 fputc(' ', fpo);
239 }
240 else
241 fputc(c, fpo);
242 }
243 if (c == '\x0c')
244 endpage = TRUE;
245 else if (c == '\n') {
246 lines++;
247 cols = 0;
248 for (z = 1; z < prnspacing; z++) {
249 if (prnlength - lines <= prnbmargin)
250 break;
251 if (!skipping)
252 fputc('\n', fpo);
253 lines++;
254 }
255 if (prnlength - lines <= prnbmargin)
256 endpage = TRUE;
257 }
258 else {
259 cols++;
260 if (c == '\t')
261 c += prntabspaces;
262 if (prnwidth - cols <= rmargin) {
263 endline = TRUE;
264 if (!skipping)
265 fputc('\n', fpo);
266 lines++;
267 }
268 for (z = 1; z < prnspacing; z++) {
269 if (prnlength - lines <= prnbmargin)
270 break;
271 if (!skipping)
272 fputc('\n', fpo);
273 lines++;
274 }
275 }
276 if (endline) {
277 do {
278 c = fgetc(fpi);
279 if (c == '\n')
280 break;
281 } while (isspace(c) && c != EOF);
282 if (c == EOF)
283 break;
284 if (!isspace(c))
285 ungetc(c, fpi);
286 endline = FALSE;
287 cols = 0;
288 if (prnlength - lines <= prnbmargin)
289 endpage = TRUE;
290 }
291 if (endpage) {
292 if (prnbmargin) {
293 if (c != '\x0c') {
294 if (!skipping)
295 fputc('\r\x0c', fpo);
296 }
297 }
298 lines = cols = 0;
299 endpage = FALSE;
300 startpage = TRUE;
301 do {
302 c = fgetc(fpi);
303 } while (c == '\n');
304 if (c == EOF)
305 break;
306 ungetc(c, fpi);
307 if (prnformat && prnalt)
308 skipping = (skipping) ? FALSE : TRUE;
309 DosSleep(1);
310 }
311 }
312 else
313 fputc(c, fpo);
314 }
315 if (prnalt && prnformat && firstpass && pages > 1) {
316 fclose(fpo);
317 mode = "a+";
318 fpo = xfsopen(li->targetpath, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
319 if (fpo) {
320 rewind(fpi);
321 firstpass = FALSE;
322 skipping = TRUE;
323 rc = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
324 HWND_DESKTOP,
325 GetPString(IDS_PRINTTITLETEXT),
326 GetPString(IDS_PRINTEVENTEXT), li->list[x]);
327 if (rc == MBID_YES) {
328 lmargin = prnrmargin;
329 rmargin = prnlmargin;
330 fputc('\x0c', fpo);
331 goto Again;
332 }
333 }
334 else
335 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
336 HWND_DESKTOP,
337 GetPString(IDS_PRINTTITLETEXT),
338 GetPString(IDS_PRINTCANTREOPENTEXT),
339 li->targetpath);
340 }
341 if (prnformfeedafter)
342 fputc('\x0c', fpo);
343 if (!StopPrinting) {
344 sprintf(s, GetPString(IDS_PRINTEDTEXT), li->list[x]);
345 AddNote(s);
346 }
347 fclose(fpo);
348 }
349 fclose(fpi);
350 }
351 }
352 DosReleaseMutexSem(PrintSem);
353 DosSleep(1);
354 }
355 if (!StopPrinting)
356 AddNote(GetPString(IDS_PRINTEDLISTTEXT));
357 }
358 WinDestroyMsgQueue(hmq2);
359 }
360 DecrThreadUsage();
361 WinTerminate(hab2);
362 }
363Abort:
364 if (li)
365 FreeListInfo(li);
366# ifdef FORTIFY
367 Fortify_LeaveScope();
368# endif
369}
370
371MRESULT EXPENTRY PrintDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
372{
373 LISTINFO *li;
374
375 switch (msg) {
376 case WM_INITDLG:
377 if (!mp2)
378 WinDismissDlg(hwnd, 0);
379 else {
380 WinSetWindowPtr(hwnd, QWL_USER, mp2);
381 WinSendDlgItemMsg(hwnd, PRN_WIDTH, EM_SETTEXTLIMIT,
382 MPFROM2SHORT(3, 0), MPVOID);
383 WinSendDlgItemMsg(hwnd, PRN_LENGTH, EM_SETTEXTLIMIT,
384 MPFROM2SHORT(3, 0), MPVOID);
385 WinSendDlgItemMsg(hwnd, PRN_LMARGIN, EM_SETTEXTLIMIT,
386 MPFROM2SHORT(2, 0), MPVOID);
387 WinSendDlgItemMsg(hwnd, PRN_RMARGIN, EM_SETTEXTLIMIT,
388 MPFROM2SHORT(2, 0), MPVOID);
389 WinSendDlgItemMsg(hwnd, PRN_TMARGIN, EM_SETTEXTLIMIT,
390 MPFROM2SHORT(2, 0), MPVOID);
391 WinSendDlgItemMsg(hwnd, PRN_BMARGIN, EM_SETTEXTLIMIT,
392 MPFROM2SHORT(2, 0), MPVOID);
393 WinSendDlgItemMsg(hwnd, PRN_SPACING, EM_SETTEXTLIMIT,
394 MPFROM2SHORT(1, 0), MPVOID);
395 WinSendDlgItemMsg(hwnd, PRN_TABSPACES, EM_SETTEXTLIMIT,
396 MPFROM2SHORT(2, 0), MPVOID);
397 WinSendDlgItemMsg(hwnd, PRN_PRINTER, EM_SETTEXTLIMIT,
398 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
399 WinSendMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
400 PosOverOkay(hwnd);
401 }
402 break;
403
404 case UM_UNDO:
405 WinCheckButton(hwnd, PRN_FORMAT, prnformat);
406 WinCheckButton(hwnd, PRN_ALT, prnalt);
407 WinCheckButton(hwnd, PRN_PAGENUMS, prnpagenums);
408 WinCheckButton(hwnd, PRN_FORMBEFORE, prnformfeedbefore);
409 WinCheckButton(hwnd, PRN_FORMAFTER, prnformfeedafter);
410 {
411 CHAR s[33];
412
413 sprintf(s, "%lu", prnwidth);
414 WinSetDlgItemText(hwnd, PRN_WIDTH, s);
415 sprintf(s, "%lu", prnlength);
416 WinSetDlgItemText(hwnd, PRN_LENGTH, s);
417 sprintf(s, "%lu", prnlmargin);
418 WinSetDlgItemText(hwnd, PRN_LMARGIN, s);
419 sprintf(s, "%lu", prnrmargin);
420 WinSetDlgItemText(hwnd, PRN_RMARGIN, s);
421 sprintf(s, "%lu", prntmargin);
422 WinSetDlgItemText(hwnd, PRN_TMARGIN, s);
423 sprintf(s, "%lu", prnbmargin);
424 WinSetDlgItemText(hwnd, PRN_BMARGIN, s);
425 sprintf(s, "%lu", prnspacing);
426 WinSetDlgItemText(hwnd, PRN_SPACING, s);
427 sprintf(s, "%lu", prntabspaces);
428 WinSetDlgItemText(hwnd, PRN_TABSPACES, s);
429 }
430 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
431 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
432 li = WinQueryWindowPtr(hwnd, QWL_USER);
433 if (!li)
434 Runtime_Error(pszSrcFile, __LINE__, NULL);
435 else {
436 INT x;
437
438 for (x = 0; li->list[x]; x++) {
439 if (IsFile(li->list[x]) == 1) {
440 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_INSERTITEM,
441 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
442 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_SELECTITEM,
443 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
444 }
445 }
446 if (!(SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMCOUNT,
447 MPVOID, MPVOID)) {
448 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
449 hwnd,
450 GetPString(IDS_TWIDDLETEXT), GetPString(IDS_NOPRINTABLETEXT));
451 WinDismissDlg(hwnd, 0);
452 }
453 }
454 return 0;
455
456 case WM_CONTROL:
457 switch (SHORT1FROMMP(mp1)) {
458 case PRN_LISTBOX:
459 if (SHORT2FROMMP(mp1) == LN_ENTER) {
460
461 SHORT x;
462 CHAR szBuffer[CCHMAXPATH];
463
464 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
465 MPFROMSHORT(LIT_FIRST), MPVOID);
466 if (x >= 0) {
467 *szBuffer = 0;
468 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
469 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
470 if (*szBuffer)
471 QuickView(hwnd, szBuffer);
472 }
473 }
474 }
475 return 0;
476
477 case WM_COMMAND:
478 switch (SHORT1FROMMP(mp1)) {
479 case DID_OK:
480 li = WinQueryWindowPtr(hwnd, QWL_USER);
481 if (!li)
482 Runtime_Error(pszSrcFile, __LINE__, NULL);
483 else {
484 prnformat = WinQueryButtonCheckstate(hwnd, PRN_FORMAT);
485 PrfWriteProfileData(fmprof, FM3Str, "Prnformat",
486 (PVOID) & prnformat, sizeof(prnformat));
487 prnalt = WinQueryButtonCheckstate(hwnd, PRN_ALT);
488 PrfWriteProfileData(fmprof, FM3Str, "Prnalt",
489 (PVOID) & prnalt, sizeof(prnalt));
490 prnpagenums = WinQueryButtonCheckstate(hwnd, PRN_PAGENUMS);
491 PrfWriteProfileData(fmprof, FM3Str, "Prnpagenums",
492 (PVOID) & prnpagenums, sizeof(prnpagenums));
493 prnformfeedbefore = WinQueryButtonCheckstate(hwnd, PRN_FORMBEFORE);
494 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedbefore",
495 (PVOID) & prnformfeedbefore,
496 sizeof(prnformfeedbefore));
497 prnformfeedafter = WinQueryButtonCheckstate(hwnd, PRN_FORMAFTER);
498 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedafter",
499 (PVOID) & prnformfeedafter,
500 sizeof(prnformfeedafter));
501 {
502 CHAR s[33];
503
504 *s = 0;
505 WinQueryDlgItemText(hwnd, PRN_WIDTH, sizeof(s), s);
506 if (atol(s) < 24 || atol(s) > 4096) {
507 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_WIDTH));
508 if (!fAlertBeepOff)
509 DosBeep(50, 100);
510 break;
511 }
512 prnwidth = atol(s);
513 PrfWriteProfileData(fmprof, FM3Str, "Prnwidth",
514 (PVOID) & prnwidth, sizeof(prnwidth));
515 *s = 0;
516 WinQueryDlgItemText(hwnd, PRN_LENGTH, sizeof(s), s);
517 if (atol(s) < 24 || atol(s) > 4096) {
518 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LENGTH));
519 if (!fAlertBeepOff)
520 DosBeep(50, 100);
521 break;
522 }
523 prnlength = atol(s);
524 PrfWriteProfileData(fmprof, FM3Str, "Prnlength",
525 (PVOID) & prnlength, sizeof(prnlength));
526 *s = 0;
527 WinQueryDlgItemText(hwnd, PRN_LMARGIN, sizeof(s), s);
528 if (atol(s) < 0 || atol(s) > prnwidth - 1) {
529 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LMARGIN));
530 if (!fAlertBeepOff)
531 DosBeep(50, 100);
532 break;
533 }
534 prnlmargin = atol(s);
535 PrfWriteProfileData(fmprof, FM3Str, "Prnlmargin",
536 (PVOID) & prnlmargin, sizeof(prnlmargin));
537 *s = 0;
538 WinQueryDlgItemText(hwnd, PRN_RMARGIN, sizeof(s), s);
539 if (atol(s) < 0 || atol(s) > (prnwidth - prnlmargin) - 1) {
540 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_RMARGIN));
541 if (!fAlertBeepOff)
542 DosBeep(50, 100);
543 break;
544 }
545 prnrmargin = atol(s);
546 PrfWriteProfileData(fmprof, FM3Str, "Prnrmargin",
547 (PVOID) & prnrmargin, sizeof(prnrmargin));
548 *s = 0;
549 WinQueryDlgItemText(hwnd, PRN_TABSPACES, sizeof(s), s);
550 if (atol(s) < 1 ||
551 atol(s) > prnwidth - ((prnlmargin + prnrmargin) - 1)) {
552 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TABSPACES));
553 if (!fAlertBeepOff)
554 DosBeep(50, 100);
555 break;
556 }
557 prntabspaces = atol(s);
558 PrfWriteProfileData(fmprof, FM3Str, "Prntabspaces",
559 (PVOID) & prntabspaces, sizeof(prntabspaces));
560 *s = 0;
561 WinQueryDlgItemText(hwnd, PRN_TMARGIN, sizeof(s), s);
562 if (atol(s) < 0 || atol(s) > prnlength - 1) {
563 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TMARGIN));
564 if (!fAlertBeepOff)
565 DosBeep(50, 100);
566 break;
567 }
568 prntmargin = atol(s);
569 PrfWriteProfileData(fmprof, FM3Str, "Prntmargin",
570 (PVOID) & prntmargin, sizeof(prntmargin));
571 *s = 0;
572 WinQueryDlgItemText(hwnd, PRN_BMARGIN, sizeof(s), s);
573 if (atol(s) < 0 || atol(s) > (prnlength - prntmargin) - 1) {
574 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_BMARGIN));
575 if (!fAlertBeepOff)
576 DosBeep(50, 100);
577 break;
578 }
579 prnbmargin = atol(s);
580 PrfWriteProfileData(fmprof, FM3Str, "Prnbmargin",
581 (PVOID) & prnbmargin, sizeof(prnbmargin));
582 *s = 0;
583 WinQueryDlgItemText(hwnd, PRN_SPACING, sizeof(s), s);
584 if (atol(s) < 1 ||
585 atol(s) > ((prnlength - prntmargin) - prnbmargin) - 1) {
586 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_SPACING));
587 if (!fAlertBeepOff)
588 DosBeep(50, 100);
589 break;
590 }
591 prnspacing = atol(s);
592 PrfWriteProfileData(fmprof, FM3Str, "Prnspacing",
593 (PVOID) & prnspacing, sizeof(prnspacing));
594 WinQueryDlgItemText(hwnd, PRN_PRINTER, sizeof(printer), printer);
595 bstrip(printer);
596 if (!*printer)
597 strcpy(printer, "PRN");
598 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
599 PrfWriteProfileString(fmprof, appname, "Printer", printer);
600 SayPrinterReady(hwnd);
601 }
602 {
603 CHAR szBuffer[CCHMAXPATH + 1];
604 UINT numfiles = 0, numalloc = 0;
605 INT error;
606 SHORT x;
607
608 if (li->list)
609 FreeList(li->list);
610 li->list = NULL;
611 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
612 MPFROMSHORT(LIT_FIRST), MPVOID);
613 if (x >= 0) {
614 do {
615 *szBuffer = 0;
616 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
617 MPFROM2SHORT(x, CCHMAXPATH),
618 MPFROMP(szBuffer));
619 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
620 if (error) {
621 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
622 break;
623 }
624 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX,
625 LM_QUERYSELECTION,
626 MPFROMSHORT(x), MPVOID);
627 } while (x >= 0);
628 }
629 }
630 if (!li->list || !li->list[0])
631 WinDismissDlg(hwnd, 0);
632 else
633 WinDismissDlg(hwnd, 1);
634 }
635 break;
636 case DID_CANCEL:
637 WinDismissDlg(hwnd, 0);
638 break;
639 case IDM_HELP:
640 if (hwndHelp)
641 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
642 MPFROM2SHORT(HELP_PRINT, 0), MPFROMSHORT(HM_RESOURCEID));
643 break;
644 case IDM_UNDO:
645 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
646 break;
647 }
648 return 0;
649 }
650 return WinDefDlgProc(hwnd, msg, mp1, mp2);
651}
652
653#pragma alloc_text(PRINTER,PrinterReady,SayPrinterReady)
654#pragma alloc_text(PRINTER2,PrintListThread)
655#pragma alloc_text(PRINTER3,PrintDlgProc)
Note: See TracBrowser for help on using the repository browser.