PATCH: fix PrintDlg*
Marcus Meissner
marcus at jet.franken.de
Tue May 1 04:38:04 CDT 2001
Hi,
PrintDlg* was returning rather bogus values in the Devnames struct,
which were confusing Photoshop 5.5 and Notepad.exe 16bit.
The 3 devnames put in there are passed to CreateDC* in that order, so
we need:
pDriverPath (usually wineps.drv),
pPrinterName (local printername as set by you or CUPS printername)
pPort (LPT1:, ... or CUPS:cupsname)
I have adjusted it accordingly and notepad.exe and Photoshp.exe appear to
be happier now.
Ciao, Marcus
Changelog:
Fixed PrintDlg so the devnames struct contains the correct driver
printer and port names.
Index: printdlg.c
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/printdlg.c,v
retrieving revision 1.39
diff -u -r1.39 printdlg.c
--- printdlg.c 2001/04/27 18:02:46 1.39
+++ printdlg.c 2001/05/01 10:36:02
@@ -39,6 +39,7 @@
LPPRINTDLG16 lpPrintDlg16;
} dlg;
LPPRINTER_INFO_2A lpPrinterInfo;
+ LPDRIVER_INFO_3A lpDriverInfo;
UINT HelpMessageID;
HICON hCollateIcon; /* PrintDlg only */
HICON hNoCollateIcon; /* PrintDlg only */
@@ -521,6 +522,8 @@
if(PrintStructures->lpPrinterInfo)
HeapFree(GetProcessHeap(),0, PrintStructures->lpPrinterInfo);
+ if(PrintStructures->lpDriverInfo)
+ HeapFree(GetProcessHeap(),0, PrintStructures->lpDriverInfo);
if(!OpenPrinterA(name, &hprn, NULL)) {
ERR("Can't open printer %s\n", name);
return FALSE;
@@ -529,6 +532,13 @@
PrintStructures->lpPrinterInfo = HeapAlloc(GetProcessHeap(),0,needed);
GetPrinterA(hprn, 2, (LPBYTE)PrintStructures->lpPrinterInfo, needed,
&needed);
+ GetPrinterDriverA(hprn, NULL, 3, NULL, 0, &needed);
+ PrintStructures->lpDriverInfo = HeapAlloc(GetProcessHeap(),0,needed);
+ if (!GetPrinterDriverA(hprn, NULL, 3, (LPBYTE)PrintStructures->lpDriverInfo,
+ needed, &needed)) {
+ ERR("GetPrinterDriverA failed for %s, fix your config!\n",PrintStructures->lpPrinterInfo->pPrinterName);
+ return FALSE;
+ }
ClosePrinter(hprn);
PRINTDLG_UpdatePrinterInfoTexts(hDlg, PrintStructures->lpPrinterInfo);
@@ -1267,6 +1277,7 @@
if(lppd->Flags & PD_RETURNDEFAULT) {
PRINTER_INFO_2A *pbuf;
+ DRIVER_INFO_3A *dbuf;
HANDLE hprn;
DWORD needed;
@@ -1284,9 +1295,19 @@
GetPrinterA(hprn, 2, NULL, 0, &needed);
pbuf = HeapAlloc(GetProcessHeap(), 0, needed);
GetPrinterA(hprn, 2, (LPBYTE)pbuf, needed, &needed);
+
+ GetPrinterDriverA(hprn, NULL, 3, NULL, 0, &needed);
+ dbuf = HeapAlloc(GetProcessHeap(),0,needed);
+ if (!GetPrinterDriverA(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed)) {
+ ERR("GetPrinterDriverA failed, le %ld, fix your config for printer %s!\n",GetLastError(),pbuf->pPrinterName);
+ COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
+ return FALSE;
+ }
ClosePrinter(hprn);
- PRINTDLG_CreateDevNames(&(lppd->hDevNames), "winspool",
- pbuf->pDevMode->dmDeviceName,
+
+ PRINTDLG_CreateDevNames(&(lppd->hDevNames),
+ dbuf->pDriverPath,
+ pbuf->pPrinterName,
pbuf->pPortName);
lppd->hDevMode = GlobalAlloc(GMEM_MOVEABLE, pbuf->pDevMode->dmSize +
pbuf->pDevMode->dmDriverExtra);
@@ -1295,6 +1316,7 @@
pbuf->pDevMode->dmDriverExtra);
GlobalUnlock(lppd->hDevMode);
HeapFree(GetProcessHeap(), 0, pbuf);
+ HeapFree(GetProcessHeap(), 0, dbuf);
bRet = TRUE;
} else {
HGLOBAL hDlgTmpl;
@@ -1328,6 +1350,7 @@
if(bRet) {
DEVMODEA *lpdm = PrintStructures->lpDevMode, *lpdmReturn;
PRINTER_INFO_2A *pi = PrintStructures->lpPrinterInfo;
+ DRIVER_INFO_3A *di = PrintStructures->lpDriverInfo;
if (lppd->hDevMode == 0) {
TRACE(" No hDevMode yet... Need to create my own\n");
@@ -1357,12 +1380,16 @@
GlobalUnlock(lppd->hDevNames);
}
}
- PRINTDLG_CreateDevNames(&(lppd->hDevNames), "winspool",
- lpdmReturn->dmDeviceName, pi->pPortName);
+ PRINTDLG_CreateDevNames(&(lppd->hDevNames),
+ di->pDriverPath,
+ pi->pPrinterName,
+ pi->pPortName
+ );
GlobalUnlock(lppd->hDevMode);
}
HeapFree(GetProcessHeap(), 0, PrintStructures->lpDevMode);
HeapFree(GetProcessHeap(), 0, PrintStructures->lpPrinterInfo);
+ HeapFree(GetProcessHeap(), 0, PrintStructures->lpDriverInfo);
HeapFree(GetProcessHeap(), 0, PrintStructures);
}
if(bRet && (lppd->Flags & PD_RETURNDC || lppd->Flags & PD_RETURNIC))
@@ -1417,6 +1444,7 @@
if(lppd->Flags & PD_RETURNDEFAULT) {
PRINTER_INFO_2A *pbuf;
+ DRIVER_INFO_3A *dbuf;
HANDLE hprn;
DWORD needed;
@@ -1434,10 +1462,19 @@
GetPrinterA(hprn, 2, NULL, 0, &needed);
pbuf = HeapAlloc(GetProcessHeap(), 0, needed);
GetPrinterA(hprn, 2, (LPBYTE)pbuf, needed, &needed);
+ GetPrinterDriverA(hprn, NULL, 3, NULL, 0, &needed);
+ dbuf = HeapAlloc(GetProcessHeap(),0,needed);
+ if (!GetPrinterDriverA(hprn, NULL, 3, (LPBYTE)dbuf, needed, &needed)) {
+ ERR("GetPrinterDriverA failed for %s, le %ld, fix your config!\n",
+ pbuf->pPrinterName,GetLastError());
+ COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
+ return FALSE;
+ }
ClosePrinter(hprn);
- PRINTDLG_CreateDevNames16(&(lppd->hDevNames), "winspool",
- pbuf->pDevMode->dmDeviceName,
- pbuf->pPortName);
+ PRINTDLG_CreateDevNames16(&(lppd->hDevNames),
+ dbuf->pDriverPath,
+ pbuf->pPrinterName,
+ pbuf->pPortName);
lppd->hDevMode = GlobalAlloc16(GMEM_MOVEABLE,pbuf->pDevMode->dmSize+
pbuf->pDevMode->dmDriverExtra);
ptr = GlobalLock16(lppd->hDevMode);
@@ -1445,6 +1482,7 @@
pbuf->pDevMode->dmDriverExtra);
GlobalUnlock16(lppd->hDevMode);
HeapFree(GetProcessHeap(), 0, pbuf);
+ HeapFree(GetProcessHeap(), 0, dbuf);
bRet = TRUE;
} else {
HGLOBAL hDlgTmpl;
@@ -1487,6 +1525,7 @@
if(bRet) {
DEVMODEA *lpdm = PrintStructures->lpDevMode, *lpdmReturn;
PRINTER_INFO_2A *pi = PrintStructures->lpPrinterInfo;
+ DRIVER_INFO_3A *di = PrintStructures->lpDriverInfo;
if (lppd->hDevMode == 0) {
TRACE(" No hDevMode yet... Need to create my own\n");
@@ -1516,14 +1555,18 @@
GlobalUnlock16(lppd->hDevNames);
}
}
- PRINTDLG_CreateDevNames16(&(lppd->hDevNames), "winspool",
- lpdmReturn->dmDeviceName, pi->pPortName);
+ PRINTDLG_CreateDevNames16(&(lppd->hDevNames),
+ di->pDriverPath,
+ pi->pPrinterName,
+ pi->pPortName
+ );
GlobalUnlock16(lppd->hDevMode);
}
if (!(lppd->Flags & (PD_ENABLESETUPTEMPLATEHANDLE | PD_ENABLESETUPTEMPLATE)))
GlobalFree16(hDlgTmpl); /* created from the 32 bits resource */
HeapFree(GetProcessHeap(), 0, PrintStructures->lpDevMode);
HeapFree(GetProcessHeap(), 0, PrintStructures->lpPrinterInfo);
+ HeapFree(GetProcessHeap(), 0, PrintStructures->lpDriverInfo);
HeapFree(GetProcessHeap(), 0, PrintStructures);
}
if(bRet && (lppd->Flags & PD_RETURNDC || lppd->Flags & PD_RETURNIC))
More information about the wine-patches
mailing list