From: Piotr Caban piotr@codeweavers.com
--- dlls/localspl/provider.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
diff --git a/dlls/localspl/provider.c b/dlls/localspl/provider.c index 762f61dbf57..26e9c66bea0 100644 --- a/dlls/localspl/provider.c +++ b/dlls/localspl/provider.c @@ -2472,6 +2472,36 @@ static BOOL WINAPI fpDeleteMonitor(LPWSTR pName, LPWSTR pEnvironment, LPWSTR pMo return FALSE; }
+static BOOL WINAPI fpResetPrinter(HANDLE hprinter, PRINTER_DEFAULTSW *def) +{ + printer_t *printer = (printer_t *)hprinter; + + if (!printer || printer->header.type != HANDLE_PRINTER) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + if (!def) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + free(printer->datatype); + if (def->pDatatype) + printer->datatype = wcsdup(def->pDatatype); + else + printer->datatype = NULL; + + free(printer->devmode); + if (def->pDevMode) + printer->devmode = dup_devmode(def->pDevMode); + else + printer->devmode = NULL; + return TRUE; +} + /***************************************************************************** * fpDeletePort [exported through PRINTPROVIDOR] * @@ -4111,7 +4141,7 @@ static const PRINTPROVIDOR backend = { NULL, /* fpPrinterMessageBox */ fpAddMonitor, fpDeleteMonitor, - NULL, /* fpResetPrinter */ + fpResetPrinter, NULL, /* fpGetPrinterDriverEx */ NULL, /* fpFindFirstPrinterChangeNotification */ NULL, /* fpFindClosePrinterChangeNotification */
From: Piotr Caban piotr@codeweavers.com
--- dlls/winspool.drv/info.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 8a948ce7575..c1c3b8bf629 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -3280,10 +3280,19 @@ BOOL WINAPI ResetPrinterA(HANDLE hPrinter, LPPRINTER_DEFAULTSA pDefault) /***************************************************************************** * ResetPrinterW [WINSPOOL.@] */ -BOOL WINAPI ResetPrinterW(HANDLE hPrinter, LPPRINTER_DEFAULTSW pDefault) +BOOL WINAPI ResetPrinterW(HANDLE printer, PRINTER_DEFAULTSW *def) { - FIXME("(%p, %p): stub\n", hPrinter, pDefault); - return FALSE; + HANDLE handle = get_backend_handle(printer); + + TRACE("(%p, %p)\n", printer, def); + + if (!handle) + { + SetLastError( ERROR_INVALID_HANDLE ); + return FALSE; + } + + return backend->fpResetPrinter(handle, def); }
/*****************************************************************************
From: Piotr Caban piotr@codeweavers.com
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55718 --- dlls/gdi32/dc.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c index e1f6703f81e..b74886379bf 100644 --- a/dlls/gdi32/dc.c +++ b/dlls/gdi32/dc.c @@ -524,7 +524,18 @@ HDC WINAPI ResetDCW( HDC hdc, const DEVMODEW *devmode ) print = get_dc_print( dc_attr ); if (print && print->flags & CALL_END_PAGE) return 0; if (!NtGdiResetDC( hdc, devmode, NULL, NULL, NULL )) return 0; - if (print && !print_copy_devmode( print, devmode )) return 0; + if (print) + { + PRINTER_DEFAULTSW prn_defaults = + { + .pDatatype = NULL, + .pDevMode = (DEVMODEW *)devmode, + .DesiredAccess = PRINTER_ACCESS_USE + }; + + if (!print_copy_devmode( print, devmode )) return 0; + ResetPrinterW( print->printer, &prn_defaults ); + } return hdc; }
With the patches ResetDC calls before StartDoc changes print job devmode. On Windows 10 it's possible to change the print job devmode until first StartPage call.
Marking as a draft since it's not good enough for bug 55718.