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
This commit is contained in:
Stefan Ziegler
2021-07-08 22:56:43 +02:00
committed by Vadim Zeitlin
parent 3b8c023744
commit 0ac8a75e97

View File

@@ -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<LPDEVMODE>(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<PRINTER_INFO_9*>(buffer.GetData())->pDevMode;
// If not available, try level 8 (global default printer
// settings).
if ( !pDevMode )
{
if ( winPrinter.GetData(buffer, 8) )
pDevMode = static_cast<PRINTER_INFO_8*>(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 )