From 0ac8a75e9749c6cd715013c058616dc5d6a52ae3 Mon Sep 17 00:00:00 2001 From: Stefan Ziegler Date: Thu, 8 Jul 2021 22:56:43 +0200 Subject: [PATCH] Initialize wxPrintData to the appropriate defaults in wxMSW Initialize DEVMODE to the per-user default printer settings or, failing that, to the global default settings. Closes https://github.com/wxWidgets/wxWidgets/pull/2422 --- src/msw/printdlg.cpp | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/src/msw/printdlg.cpp b/src/msw/printdlg.cpp index 22ae152b24..4cf8bdebed 100644 --- a/src/msw/printdlg.cpp +++ b/src/msw/printdlg.cpp @@ -76,6 +76,31 @@ public: return result; } + // Try to get printer information at the specified level. + // + // Fills in the provided buffer and returns true on success, otherwise just + // returns false. + bool GetData(wxMemoryBuffer& buffer, int level) + { + if ( !m_hPrinter ) + return false; + + DWORD bufSize = 0; + if ( !::GetPrinter(m_hPrinter, level, NULL, 0, &bufSize) || !bufSize ) + return false; + + if ( !::GetPrinter(m_hPrinter, + level, + (LPBYTE) buffer.GetWriteBuf(bufSize), + bufSize, + &bufSize) ) + return false; + + buffer.SetDataLen(bufSize); + + return true; + } + operator HANDLE() { return m_hPrinter; } operator bool() { return m_hPrinter != (HANDLE)NULL; } @@ -488,6 +513,47 @@ void wxWindowsPrintNativeData::InitializeDevMode(const wxString& printerName, Wi } } + // Try to initialize devmode to user or system default. + if (m_devMode) + { + GlobalPtrLock lockDevMode(m_devMode); + LPDEVMODE tempDevMode = static_cast(lockDevMode.Get()); + if (tempDevMode) + { + WinPrinter winPrinter; + if (winPrinter.Open(tempDevMode->dmDeviceName)) + { + DEVMODE* pDevMode = NULL; + + wxMemoryBuffer buffer; + + // Try level 9 (per-user default printer settings) first. + if ( winPrinter.GetData(buffer, 9) ) + pDevMode = static_cast(buffer.GetData())->pDevMode; + + // If not available, try level 8 (global default printer + // settings). + if ( !pDevMode ) + { + if ( winPrinter.GetData(buffer, 8) ) + pDevMode = static_cast(buffer.GetData())->pDevMode; + } + + if ( pDevMode ) + { + DWORD devModeSize = pDevMode->dmSize + pDevMode->dmDriverExtra; + GlobalPtr newDevMode(devModeSize, GMEM_FIXED | GMEM_ZEROINIT); + if ( newDevMode ) + { + memcpy(newDevMode, pDevMode, devModeSize); + + ::GlobalFree(m_devMode); + m_devMode = newDevMode.Release(); + } + } + } + } + } } bool wxWindowsPrintNativeData::TransferFrom( const wxPrintData &data )