From 7128a6595adc94606667c8a14f66d804918a580a Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 10 Oct 2023 15:35:05 +0200 Subject: [PATCH] wineps.drv: Use first page DEVMODE to determine number of copies and collation. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55718 --- dlls/wineps.drv/printproc.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/dlls/wineps.drv/printproc.c b/dlls/wineps.drv/printproc.c index 3de05eea3f5..46ebe0b8e04 100644 --- a/dlls/wineps.drv/printproc.c +++ b/dlls/wineps.drv/printproc.c @@ -23,6 +23,7 @@ #include #include +#include #include #include #include @@ -40,6 +41,7 @@ struct pp_data { DWORD magic; HANDLE hport; + WCHAR *port; WCHAR *doc_name; WCHAR *out_file; @@ -2980,6 +2982,7 @@ HANDLE WINAPI OpenPrintProcessor(WCHAR *port, PRINTPROCESSOROPENDATA *open_data) return NULL; data->magic = PP_MAGIC; data->hport = hport; + data->port = wcsdup(port); data->doc_name = wcsdup(open_data->pDocumentName); data->out_file = wcsdup(open_data->pOutputFile); @@ -3003,6 +3006,7 @@ HANDLE WINAPI OpenPrintProcessor(WCHAR *port, PRINTPROCESSOROPENDATA *open_data) BOOL WINAPI PrintDocumentOnPrintProcessor(HANDLE pp, WCHAR *doc_name) { struct pp_data *data = get_handle_data(pp); + DEVMODEW *devmode = NULL; emfspool_header header; LARGE_INTEGER pos, cur; record_hdr record; @@ -3016,6 +3020,21 @@ BOOL WINAPI PrintDocumentOnPrintProcessor(HANDLE pp, WCHAR *doc_name) if (!data) return FALSE; + spool_data = GdiGetSpoolFileHandle(data->port, + &data->ctx->Devmode->dmPublic, doc_name); + GdiGetDevmodeForPage(spool_data, 1, &devmode, NULL); + if (devmode && devmode->dmFields & DM_COPIES) + { + data->ctx->Devmode->dmPublic.dmFields |= DM_COPIES; + data->ctx->Devmode->dmPublic.dmCopies = devmode->dmCopies; + } + if (devmode && devmode->dmFields & DM_COLLATE) + { + data->ctx->Devmode->dmPublic.dmFields |= DM_COLLATE; + data->ctx->Devmode->dmPublic.dmCollate = devmode->dmCollate; + } + GdiDeleteSpoolFileHandle(spool_data); + if (!OpenPrinterW(doc_name, &spool_data, NULL)) return FALSE; @@ -3166,6 +3185,7 @@ BOOL WINAPI ClosePrintProcessor(HANDLE pp) return FALSE; ClosePrinter(data->hport); + free(data->port); free(data->doc_name); free(data->out_file); DeleteDC(data->ctx->hdc);