PATCH - Win16/32 split of comdlg print dialogs
Steven Edwards
Steven_Ed4153 at yahoo.com
Sun Jul 27 23:31:33 CDT 2003
Changelog:
Split Win16/32 Printer dialogs
-------------- next part --------------
Index: Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/Makefile.in,v
retrieving revision 1.31
diff -u -r1.31 Makefile.in
--- Makefile.in 16 Jun 2003 01:19:16 -0000 1.31
+++ Makefile.in 28 Jul 2003 04:25:52 -0000
@@ -28,7 +28,8 @@
colordlg16.c \
filedlg16.c \
finddlg.c \
- fontdlg16.c
+ fontdlg16.c \
+ printdlg16.c
RC_SRCS= rsrc.rc
Index: printdlg.c
===================================================================
RCS file: /home/wine/wine/dlls/commdlg/printdlg.c,v
retrieving revision 1.67
diff -u -r1.67 printdlg.c
--- printdlg.c 30 Jun 2003 02:06:22 -0000 1.67
+++ printdlg.c 28 Jul 2003 04:24:04 -0000
@@ -43,94 +43,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
#include "cdlg.h"
-
-/* This PRINTDLGA internal structure stores
- * pointers to several throughout useful structures.
- *
- */
-typedef struct
-{
- LPDEVMODEA lpDevMode;
- struct {
- LPPRINTDLGA lpPrintDlg;
- LPPRINTDLG16 lpPrintDlg16;
- } dlg;
- LPPRINTER_INFO_2A lpPrinterInfo;
- LPDRIVER_INFO_3A lpDriverInfo;
- UINT HelpMessageID;
- HICON hCollateIcon; /* PrintDlg only */
- HICON hNoCollateIcon; /* PrintDlg only */
- HICON hPortraitIcon; /* PrintSetupDlg only */
- HICON hLandscapeIcon; /* PrintSetupDlg only */
- HWND hwndUpDown;
-} PRINT_PTRA;
-
-typedef struct
-{
- LPDEVMODEW lpDevMode;
- struct {
- LPPRINTDLGW lpPrintDlg;
- } dlg;
- LPPRINTER_INFO_2W lpPrinterInfo;
- LPDRIVER_INFO_3W lpDriverInfo;
- UINT HelpMessageID;
- HICON hCollateIcon; /* PrintDlg only */
- HICON hNoCollateIcon; /* PrintDlg only */
- HICON hPortraitIcon; /* PrintSetupDlg only */
- HICON hLandscapeIcon; /* PrintSetupDlg only */
- HWND hwndUpDown;
-} PRINT_PTRW;
-
-/* Debugging info */
-static struct pd_flags {
- DWORD flag;
- LPSTR name;
-} pd_flags[] = {
- {PD_SELECTION, "PD_SELECTION "},
- {PD_PAGENUMS, "PD_PAGENUMS "},
- {PD_NOSELECTION, "PD_NOSELECTION "},
- {PD_NOPAGENUMS, "PD_NOPAGENUMS "},
- {PD_COLLATE, "PD_COLLATE "},
- {PD_PRINTTOFILE, "PD_PRINTTOFILE "},
- {PD_PRINTSETUP, "PD_PRINTSETUP "},
- {PD_NOWARNING, "PD_NOWARNING "},
- {PD_RETURNDC, "PD_RETURNDC "},
- {PD_RETURNIC, "PD_RETURNIC "},
- {PD_RETURNDEFAULT, "PD_RETURNDEFAULT "},
- {PD_SHOWHELP, "PD_SHOWHELP "},
- {PD_ENABLEPRINTHOOK, "PD_ENABLEPRINTHOOK "},
- {PD_ENABLESETUPHOOK, "PD_ENABLESETUPHOOK "},
- {PD_ENABLEPRINTTEMPLATE, "PD_ENABLEPRINTTEMPLATE "},
- {PD_ENABLESETUPTEMPLATE, "PD_ENABLESETUPTEMPLATE "},
- {PD_ENABLEPRINTTEMPLATEHANDLE, "PD_ENABLEPRINTTEMPLATEHANDLE "},
- {PD_ENABLESETUPTEMPLATEHANDLE, "PD_ENABLESETUPTEMPLATEHANDLE "},
- {PD_USEDEVMODECOPIES, "PD_USEDEVMODECOPIES[ANDCOLLATE] "},
- {PD_DISABLEPRINTTOFILE, "PD_DISABLEPRINTTOFILE "},
- {PD_HIDEPRINTTOFILE, "PD_HIDEPRINTTOFILE "},
- {PD_NONETWORKBUTTON, "PD_NONETWORKBUTTON "},
- {-1, NULL}
-};
-
-/* Debugging info */
-static struct pd_flags psd_flags[] = {
- {PSD_MINMARGINS,"PSD_MINMARGINS"},
- {PSD_MARGINS,"PSD_MARGINS"},
- {PSD_INTHOUSANDTHSOFINCHES,"PSD_INTHOUSANDTHSOFINCHES"},
- {PSD_INHUNDREDTHSOFMILLIMETERS,"PSD_INHUNDREDTHSOFMILLIMETERS"},
- {PSD_DISABLEMARGINS,"PSD_DISABLEMARGINS"},
- {PSD_DISABLEPRINTER,"PSD_DISABLEPRINTER"},
- {PSD_NOWARNING,"PSD_NOWARNING"},
- {PSD_DISABLEORIENTATION,"PSD_DISABLEORIENTATION"},
- {PSD_RETURNDEFAULT,"PSD_RETURNDEFAULT"},
- {PSD_DISABLEPAPER,"PSD_DISABLEPAPER"},
- {PSD_SHOWHELP,"PSD_SHOWHELP"},
- {PSD_ENABLEPAGESETUPHOOK,"PSD_ENABLEPAGESETUPHOOK"},
- {PSD_ENABLEPAGESETUPTEMPLATE,"PSD_ENABLEPAGESETUPTEMPLATE"},
- {PSD_ENABLEPAGESETUPTEMPLATEHANDLE,"PSD_ENABLEPAGESETUPTEMPLATEHANDLE"},
- {PSD_ENABLEPAGEPAINTHOOK,"PSD_ENABLEPAGEPAINTHOOK"},
- {PSD_DISABLEPAGEPAINTING,"PSD_DISABLEPAGEPAINTING"},
- {-1, NULL}
-};
+#include "printdlg.h"
/* Yes these constants are the same, but we're just copying win98 */
#define UPDOWN_ID 0x270f
@@ -145,7 +58,7 @@
*
* Returns TRUE on success else FALSE
*/
-static BOOL PRINTDLG_GetDefaultPrinterNameA(LPSTR buf, DWORD len)
+BOOL PRINTDLG_GetDefaultPrinterNameA(LPSTR buf, DWORD len)
{
char *ptr;
@@ -190,7 +103,7 @@
*
* Returns TRUE on success else FALSE
*/
-static BOOL PRINTDLG_OpenDefaultPrinter(HANDLE *hprn)
+BOOL PRINTDLG_OpenDefaultPrinter(HANDLE *hprn)
{
char buf[260];
BOOL res;
@@ -215,7 +128,7 @@
*
* Returns number of printers added to list.
*/
-static INT PRINTDLG_SetUpPrinterListComboA(HWND hDlg, UINT id, LPCSTR name)
+INT PRINTDLG_SetUpPrinterListComboA(HWND hDlg, UINT id, LPCSTR name)
{
DWORD needed, num;
INT i;
@@ -374,50 +287,6 @@
return TRUE;
}
-
-static BOOL PRINTDLG_CreateDevNames16(HGLOBAL16 *hmem, char* DeviceDriverName,
- char* DeviceName, char* OutputPort)
-{
- long size;
- char* pDevNamesSpace;
- char* pTempPtr;
- LPDEVNAMES lpDevNames;
- char buf[260];
-
- size = strlen(DeviceDriverName) + 1
- + strlen(DeviceName) + 1
- + strlen(OutputPort) + 1
- + sizeof(DEVNAMES);
-
- if(*hmem)
- *hmem = GlobalReAlloc16(*hmem, size, GMEM_MOVEABLE);
- else
- *hmem = GlobalAlloc16(GMEM_MOVEABLE, size);
- if (*hmem == 0)
- return FALSE;
-
- pDevNamesSpace = GlobalLock16(*hmem);
- lpDevNames = (LPDEVNAMES) pDevNamesSpace;
-
- pTempPtr = pDevNamesSpace + sizeof(DEVNAMES);
- strcpy(pTempPtr, DeviceDriverName);
- lpDevNames->wDriverOffset = pTempPtr - pDevNamesSpace;
-
- pTempPtr += strlen(DeviceDriverName) + 1;
- strcpy(pTempPtr, DeviceName);
- lpDevNames->wDeviceOffset = pTempPtr - pDevNamesSpace;
-
- pTempPtr += strlen(DeviceName) + 1;
- strcpy(pTempPtr, OutputPort);
- lpDevNames->wOutputOffset = pTempPtr - pDevNamesSpace;
-
- PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf));
- lpDevNames->wDefault = (strcmp(buf, DeviceName) == 0) ? 1 : 0;
- GlobalUnlock16(*hmem);
- return TRUE;
-}
-
-
/***********************************************************************
* PRINTDLG_UpdatePrintDlg [internal]
*
@@ -1005,7 +874,7 @@
* PRINTDLG_ChangePrinter
*
*/
-static BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name,
+BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name,
PRINT_PTRA *PrintStructures)
{
LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg;
@@ -1540,127 +1409,10 @@
return TRUE;
}
-
-/***********************************************************************
- * PRINTDLG_WMInitDialog [internal]
- */
-static LRESULT PRINTDLG_WMInitDialog16(HWND hDlg, WPARAM wParam,
- PRINT_PTRA* PrintStructures)
-{
- LPPRINTDLG16 lppd = PrintStructures->dlg.lpPrintDlg16;
- DEVNAMES *pdn;
- DEVMODEA *pdm;
- char *name = NULL;
- UINT comboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4;
-
- /* load Collate ICONs */
- PrintStructures->hCollateIcon =
- LoadIconA(COMDLG32_hInstance, "PD32_COLLATE");
- PrintStructures->hNoCollateIcon =
- LoadIconA(COMDLG32_hInstance, "PD32_NOCOLLATE");
- if(PrintStructures->hCollateIcon == 0 ||
- PrintStructures->hNoCollateIcon == 0) {
- ERR("no icon in resourcefile\n");
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- EndDialog(hDlg, FALSE);
- }
-
- /* load Paper Orientation ICON */
- /* FIXME: not implemented yet */
-
- /*
- * if lppd->Flags PD_SHOWHELP is specified, a HELPMESGSTRING message
- * must be registered and the Help button must be shown.
- */
- if (lppd->Flags & PD_SHOWHELP) {
- if((PrintStructures->HelpMessageID =
- RegisterWindowMessageA(HELPMSGSTRINGA)) == 0) {
- COMDLG32_SetCommDlgExtendedError(CDERR_REGISTERMSGFAIL);
- return FALSE;
- }
- } else
- PrintStructures->HelpMessageID = 0;
-
- if (!(lppd->Flags & PD_PRINTSETUP)) {
- /* We have a print quality combo box. What shall we do? */
- if (GetDlgItem(hDlg,cmb1)) {
- char buf [20];
-
- FIXME("Print quality only displaying currently.\n");
-
- pdm = GlobalLock16(lppd->hDevMode);
- if(pdm) {
- switch (pdm->dmPrintQuality) {
- case DMRES_HIGH : strcpy(buf,"High");break;
- case DMRES_MEDIUM : strcpy(buf,"Medium");break;
- case DMRES_LOW : strcpy(buf,"Low");break;
- case DMRES_DRAFT : strcpy(buf,"Draft");break;
- case 0 : strcpy(buf,"Default");break;
- default : sprintf(buf,"%ddpi",pdm->dmPrintQuality);break;
- }
- GlobalUnlock16(lppd->hDevMode);
- } else
- strcpy(buf,"Default");
- SendDlgItemMessageA(hDlg,cmb1,CB_ADDSTRING,0,(LPARAM)buf);
- SendDlgItemMessageA(hDlg,cmb1,CB_SETCURSEL,0,0);
- EnableWindow(GetDlgItem(hDlg,cmb1),FALSE);
- }
- }
-
- /* FIXME: I allow more freedom than either Win95 or WinNT,
- * which do not agree to what errors should be thrown or not
- * in case nToPage or nFromPage is out-of-range.
- */
- if (lppd->nMaxPage < lppd->nMinPage)
- lppd->nMaxPage = lppd->nMinPage;
- if (lppd->nMinPage == lppd->nMaxPage)
- lppd->Flags |= PD_NOPAGENUMS;
- if (lppd->nToPage < lppd->nMinPage)
- lppd->nToPage = lppd->nMinPage;
- if (lppd->nToPage > lppd->nMaxPage)
- lppd->nToPage = lppd->nMaxPage;
- if (lppd->nFromPage < lppd->nMinPage)
- lppd->nFromPage = lppd->nMinPage;
- if (lppd->nFromPage > lppd->nMaxPage)
- lppd->nFromPage = lppd->nMaxPage;
-
- /* If the printer combo box is in the dialog, fill it */
- if (GetDlgItem(hDlg,comboID)) {
- /* Fill Combobox
- */
- pdn = GlobalLock16(lppd->hDevNames);
- pdm = GlobalLock16(lppd->hDevMode);
- if(pdn)
- name = (char*)pdn + pdn->wDeviceOffset;
- else if(pdm)
- name = pdm->dmDeviceName;
- PRINTDLG_SetUpPrinterListComboA(hDlg, comboID, name);
- if(pdm) GlobalUnlock16(lppd->hDevMode);
- if(pdn) GlobalUnlock16(lppd->hDevNames);
-
- /* Now find selected printer and update rest of dlg */
- name = HeapAlloc(GetProcessHeap(),0,256);
- if (GetDlgItemTextA(hDlg, comboID, name, 255))
- PRINTDLG_ChangePrinterA(hDlg, name, PrintStructures);
- } else {
- /* else just use default printer */
- char name[200];
- BOOL ret = PRINTDLG_GetDefaultPrinterNameA(name, sizeof(name));
-
- if (ret)
- PRINTDLG_ChangePrinterA(hDlg, name, PrintStructures);
- else
- FIXME("No default printer found, expect problems!\n");
- }
- HeapFree(GetProcessHeap(),0,name);
-
- return TRUE;
-}
-
/***********************************************************************
* PRINTDLG_WMCommand [internal]
*/
-static LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
+LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
LPARAM lParam, PRINT_PTRA* PrintStructures)
{
LPPRINTDLGA lppd = PrintStructures->dlg.lpPrintDlg;
@@ -1718,6 +1470,7 @@
}
break;
+#if 0
case psh1: /* Print Setup */
{
PRINTDLG16 pdlg;
@@ -1734,6 +1487,7 @@
break;
}
break;
+#endif
case psh2: /* Properties button */
{
HANDLE hPrinter;
@@ -2088,55 +1842,6 @@
return res;
}
-
-/************************************************************
- *
- * PRINTDLG_Get16TemplateFrom32 [Internal]
- * Generates a 16 bits template from the Wine 32 bits resource
- *
- */
-static HGLOBAL16 PRINTDLG_Get16TemplateFrom32(char *PrintResourceName)
-{
- HRSRC hResInfo;
- HGLOBAL hDlgTmpl32;
- LPCVOID template32;
- DWORD size;
- HGLOBAL16 hGlobal16;
- LPVOID template;
-
- if (!(hResInfo = FindResourceA(COMDLG32_hInstance,
- PrintResourceName, RT_DIALOGA)))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
- return 0;
- }
- if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo )) ||
- !(template32 = LockResource( hDlgTmpl32 )))
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return 0;
- }
- size = SizeofResource(COMDLG32_hInstance, hResInfo);
- hGlobal16 = GlobalAlloc16(0, size);
- if (!hGlobal16)
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
- ERR("alloc failure for %ld bytes\n", size);
- return 0;
- }
- template = GlobalLock16(hGlobal16);
- if (!template)
- {
- COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
- ERR("global lock failure for %x handle\n", hGlobal16);
- GlobalFree16(hGlobal16);
- return 0;
- }
- ConvertDialog32To16((LPVOID)template32, size, (LPVOID)template);
- GlobalUnlock16(hGlobal16);
- return hGlobal16;
-}
-
/************************************************************
*
* PRINTDLG_GetDlgTemplate
@@ -2210,42 +1915,6 @@
return hDlgTmpl;
}
-
-
-/************************************************************
- *
- * PRINTDLG_GetDlgTemplate
- *
- */
-static HGLOBAL16 PRINTDLG_GetDlgTemplate16(PRINTDLG16 *lppd)
-{
- HGLOBAL16 hDlgTmpl, hResInfo;
-
- if (lppd->Flags & PD_PRINTSETUP) {
- if(lppd->Flags & PD_ENABLESETUPTEMPLATEHANDLE) {
- hDlgTmpl = lppd->hSetupTemplate;
- } else if(lppd->Flags & PD_ENABLESETUPTEMPLATE) {
- hResInfo = FindResource16(lppd->hInstance,
- MapSL(lppd->lpSetupTemplateName), RT_DIALOGA);
- hDlgTmpl = LoadResource16(lppd->hInstance, hResInfo);
- } else {
- hDlgTmpl = PRINTDLG_Get16TemplateFrom32("PRINT32_SETUP");
- }
- } else {
- if(lppd->Flags & PD_ENABLEPRINTTEMPLATEHANDLE) {
- hDlgTmpl = lppd->hPrintTemplate;
- } else if(lppd->Flags & PD_ENABLEPRINTTEMPLATE) {
- hResInfo = FindResource16(lppd->hInstance,
- MapSL(lppd->lpPrintTemplateName),
- RT_DIALOGA);
- hDlgTmpl = LoadResource16(lppd->hInstance, hResInfo);
- } else {
- hDlgTmpl = PRINTDLG_Get16TemplateFrom32("PRINT32");
- }
- }
- return hDlgTmpl;
-}
-
/***********************************************************************
*
* PRINTDLG_CreateDC
@@ -2293,27 +1962,6 @@
return lppd->hDC ? TRUE : FALSE;
}
-static BOOL PRINTDLG_CreateDC16(LPPRINTDLG16 lppd)
-{
- DEVNAMES *pdn = GlobalLock16(lppd->hDevNames);
- DEVMODEA *pdm = GlobalLock16(lppd->hDevMode);
-
- if(lppd->Flags & PD_RETURNDC) {
- lppd->hDC = HDC_16(CreateDCA((char*)pdn + pdn->wDriverOffset,
- (char*)pdn + pdn->wDeviceOffset,
- (char*)pdn + pdn->wOutputOffset,
- pdm ));
- } else if(lppd->Flags & PD_RETURNIC) {
- lppd->hDC = HDC_16(CreateICA((char*)pdn + pdn->wDriverOffset,
- (char*)pdn + pdn->wDeviceOffset,
- (char*)pdn + pdn->wOutputOffset,
- pdm ));
- }
- GlobalUnlock16(lppd->hDevNames);
- GlobalUnlock16(lppd->hDevMode);
- return lppd->hDC ? TRUE : FALSE;
-}
-
/***********************************************************************
* PrintDlgA (COMDLG32.@)
*
@@ -2645,188 +2293,6 @@
}
/***********************************************************************
- * PrintDlg (COMMDLG.20)
- *
- * Displays the the PRINT dialog box, which enables the user to specify
- * specific properties of the print job.
- *
- * RETURNS
- * nonzero if the user pressed the OK button
- * zero if the user cancelled the window or an error occurred
- *
- * BUGS
- * * calls up to the 32-bit versions of the Dialogs, which look different
- * * Customizing is *not* implemented.
- */
-
-BOOL16 WINAPI PrintDlg16(
- LPPRINTDLG16 lppd /* [in/out] ptr to PRINTDLG struct */
-) {
- BOOL bRet = FALSE;
- LPVOID ptr;
- HINSTANCE16 hInst = GetWindowWord( HWND_32(lppd->hwndOwner), GWL_HINSTANCE );
-
- if(TRACE_ON(commdlg)) {
- char flagstr[1000] = "";
- struct pd_flags *pflag = pd_flags;
- for( ; pflag->name; pflag++) {
- if(lppd->Flags & pflag->flag)
- strcat(flagstr, pflag->name);
- }
- TRACE("(%p): hwndOwner = %08x, hDevMode = %08x, hDevNames = %08x\n"
- "pp. %d-%d, min p %d, max p %d, copies %d, hinst %08x\n"
- "flags %08lx (%s)\n",
- lppd, lppd->hwndOwner, lppd->hDevMode, lppd->hDevNames,
- lppd->nFromPage, lppd->nToPage, lppd->nMinPage, lppd->nMaxPage,
- lppd->nCopies, lppd->hInstance, lppd->Flags, flagstr);
- }
-
- if(lppd->lStructSize != sizeof(PRINTDLG16)) {
- ERR("structure size (%ld/%d)\n",lppd->lStructSize,sizeof(PRINTDLG16));
- COMDLG32_SetCommDlgExtendedError(CDERR_STRUCTSIZE);
- return FALSE;
- }
-
- if(lppd->Flags & PD_RETURNDEFAULT) {
- PRINTER_INFO_2A *pbuf;
- DRIVER_INFO_3A *dbuf;
- HANDLE hprn;
- DWORD needed;
-
- if(lppd->hDevMode || lppd->hDevNames) {
- WARN("hDevMode or hDevNames non-zero for PD_RETURNDEFAULT\n");
- COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
- return FALSE;
- }
- if(!PRINTDLG_OpenDefaultPrinter(&hprn)) {
- WARN("Can't find default printer\n");
- COMDLG32_SetCommDlgExtendedError(PDERR_NODEFAULTPRN);
- return FALSE;
- }
-
- 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),
- dbuf->pDriverPath,
- pbuf->pPrinterName,
- pbuf->pPortName);
- lppd->hDevMode = GlobalAlloc16(GMEM_MOVEABLE,pbuf->pDevMode->dmSize+
- pbuf->pDevMode->dmDriverExtra);
- ptr = GlobalLock16(lppd->hDevMode);
- memcpy(ptr, pbuf->pDevMode, pbuf->pDevMode->dmSize +
- pbuf->pDevMode->dmDriverExtra);
- GlobalUnlock16(lppd->hDevMode);
- HeapFree(GetProcessHeap(), 0, pbuf);
- HeapFree(GetProcessHeap(), 0, dbuf);
- bRet = TRUE;
- } else {
- HGLOBAL16 hDlgTmpl;
- PRINT_PTRA *PrintStructures;
-
- /* load Dialog resources,
- * depending on Flags indicates Print32 or Print32_setup dialog
- */
- hDlgTmpl = PRINTDLG_GetDlgTemplate16(lppd);
- if (!hDlgTmpl) {
- COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
- return FALSE;
- }
- PrintStructures = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
- sizeof(PRINT_PTRA));
- PrintStructures->dlg.lpPrintDlg16 = lppd;
- PrintStructures->dlg.lpPrintDlg = (LPPRINTDLGA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(PRINTDLGA));
-#define CVAL(x) PrintStructures->dlg.lpPrintDlg->x = lppd->x;
-#define MVAL(x) PrintStructures->dlg.lpPrintDlg->x = MapSL(lppd->x);
- CVAL(Flags);
- PrintStructures->dlg.lpPrintDlg->hwndOwner = HWND_32(lppd->hwndOwner);
- PrintStructures->dlg.lpPrintDlg->hDC = HDC_32(lppd->hDC);
- CVAL(nFromPage);CVAL(nToPage);CVAL(nMinPage);CVAL(nMaxPage);
- CVAL(nCopies);
- PrintStructures->dlg.lpPrintDlg->hInstance = HINSTANCE_32(lppd->hInstance);
- CVAL(lCustData);
- MVAL(lpPrintTemplateName);MVAL(lpSetupTemplateName);
- /* Don't copy rest, it is 16 bit specific */
-#undef MVAL
-#undef CVAL
-
- PrintStructures->lpDevMode = HeapAlloc(GetProcessHeap(),0,sizeof(DEVMODEA));
-
- /* and create & process the dialog .
- * -1 is failure, 0 is broken hwnd, everything else is ok.
- */
- bRet = (0<DialogBoxIndirectParam16(
- hInst, hDlgTmpl, lppd->hwndOwner,
- (DLGPROC16)GetProcAddress16(GetModuleHandle16("COMMDLG"),(LPCSTR)21),
- (LPARAM)PrintStructures
- )
- );
- if (!PrintStructures->lpPrinterInfo) bRet = FALSE;
- 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");
- lppd->hDevMode = GlobalAlloc16(GMEM_MOVEABLE,
- lpdm->dmSize + lpdm->dmDriverExtra);
- } else {
- WORD locks;
- if((locks = (GlobalFlags16(lppd->hDevMode)&GMEM_LOCKCOUNT))) {
- WARN("hDevMode has %d locks on it. Unlocking it now\n", locks);
- while(locks--) {
- GlobalUnlock16(lppd->hDevMode);
- TRACE("Now got %d locks\n", locks);
- }
- }
- lppd->hDevMode = GlobalReAlloc16(lppd->hDevMode,
- lpdm->dmSize + lpdm->dmDriverExtra,
- GMEM_MOVEABLE);
- }
- lpdmReturn = GlobalLock16(lppd->hDevMode);
- memcpy(lpdmReturn, lpdm, lpdm->dmSize + lpdm->dmDriverExtra);
-
- if (lppd->hDevNames != 0) {
- WORD locks;
- if((locks = (GlobalFlags16(lppd->hDevNames)&GMEM_LOCKCOUNT))) {
- WARN("hDevNames has %d locks on it. Unlocking it now\n", locks);
- while(locks--)
- GlobalUnlock16(lppd->hDevNames);
- }
- }
- 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))
- bRet = PRINTDLG_CreateDC16(lppd);
-
- TRACE("exit! (%d)\n", bRet);
- return bRet;
-}
-
-
-/***********************************************************************
*
* PageSetupDlg
* rad1 - portrait
@@ -3460,98 +2926,6 @@
);
return bRet;
}
-
-/**********************************************************************
- *
- * 16 bit commdlg
- */
-
-/***********************************************************************
- * PrintDlgProc (COMMDLG.21)
- */
-BOOL16 CALLBACK PrintDlgProc16(HWND16 hDlg16, UINT16 uMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- HWND hDlg = HWND_32(hDlg16);
- PRINT_PTRA* PrintStructures;
- BOOL16 res = FALSE;
-
- if (uMsg!=WM_INITDIALOG) {
- PrintStructures = (PRINT_PTRA*)GetPropA(hDlg,"__WINE_PRINTDLGDATA");
- if (!PrintStructures)
- return FALSE;
- } else {
- PrintStructures = (PRINT_PTRA*) lParam;
- SetPropA(hDlg,"__WINE_PRINTDLGDATA",PrintStructures);
- res = PRINTDLG_WMInitDialog16(hDlg, wParam, PrintStructures);
-
- if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) {
- res = CallWindowProc16(
- (WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook,
- hDlg16, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg16
- );
- }
- return res;
- }
-
- if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) {
- res = CallWindowProc16(
- (WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook,
- hDlg16,uMsg, wParam, lParam
- );
- if(LOWORD(res)) return res;
- }
-
- switch (uMsg) {
- case WM_COMMAND: {
- /* We need to map those for the 32bit window procedure, compare
- * with 32Ato16 mapper in winproc.c
- */
- return PRINTDLG_WMCommandA(
- hDlg,
- MAKEWPARAM(wParam,HIWORD(lParam)),
- LOWORD(lParam),
- PrintStructures
- );
- }
- case WM_DESTROY:
- DestroyIcon(PrintStructures->hCollateIcon);
- DestroyIcon(PrintStructures->hNoCollateIcon);
- /* FIXME: don't forget to delete the paper orientation icons here! */
-
- return FALSE;
- }
- return res;
-}
-
-
-/***********************************************************************
- * PrintSetupDlgProc (COMMDLG.22)
- */
-BOOL16 CALLBACK PrintSetupDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
- LPARAM lParam)
-{
- HWND hWnd = HWND_32(hWnd16);
- switch (wMsg)
- {
- case WM_INITDIALOG:
- TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
- ShowWindow(hWnd, SW_SHOWNORMAL);
- return (TRUE);
- case WM_COMMAND:
- switch (wParam) {
- case IDOK:
- EndDialog(hWnd, TRUE);
- return(TRUE);
- case IDCANCEL:
- EndDialog(hWnd, FALSE);
- return(TRUE);
- }
- return(FALSE);
- }
- return FALSE;
-}
-
/***********************************************************************
* PrintDlgExA (COMDLG32.@)
--- /dev/null Mon Jul 28 00:28:12 2003
+++ printdlg.h Mon Jul 28 00:25:26 2003
@@ -0,0 +1,129 @@
+/*
+ * COMMDLG - Print Dialog
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ * Copyright 2000 Huw D M Davies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _WINE_PRINTDLG_H
+#define _WINE_PRINTDLG_H
+
+/* This PRINTDLGA internal structure stores
+ * pointers to several throughout useful structures.
+ *
+ */
+
+typedef struct
+{
+ LPDEVMODEA lpDevMode;
+ struct {
+ LPPRINTDLGA lpPrintDlg;
+ LPPRINTDLG16 lpPrintDlg16;
+ } dlg;
+ LPPRINTER_INFO_2A lpPrinterInfo;
+ LPDRIVER_INFO_3A lpDriverInfo;
+ UINT HelpMessageID;
+ HICON hCollateIcon; /* PrintDlg only */
+ HICON hNoCollateIcon; /* PrintDlg only */
+ HICON hPortraitIcon; /* PrintSetupDlg only */
+ HICON hLandscapeIcon; /* PrintSetupDlg only */
+ HWND hwndUpDown;
+} PRINT_PTRA;
+
+typedef struct
+{
+ LPDEVMODEW lpDevMode;
+ struct {
+ LPPRINTDLGW lpPrintDlg;
+ } dlg;
+ LPPRINTER_INFO_2W lpPrinterInfo;
+ LPDRIVER_INFO_3W lpDriverInfo;
+ UINT HelpMessageID;
+ HICON hCollateIcon; /* PrintDlg only */
+ HICON hNoCollateIcon; /* PrintDlg only */
+ HICON hPortraitIcon; /* PrintSetupDlg only */
+ HICON hLandscapeIcon; /* PrintSetupDlg only */
+ HWND hwndUpDown;
+} PRINT_PTRW;
+
+/* Debugging info */
+static struct pd_flags {
+ DWORD flag;
+ LPSTR name;
+} pd_flags[] = {
+ {PD_SELECTION, "PD_SELECTION "},
+ {PD_PAGENUMS, "PD_PAGENUMS "},
+ {PD_NOSELECTION, "PD_NOSELECTION "},
+ {PD_NOPAGENUMS, "PD_NOPAGENUMS "},
+ {PD_COLLATE, "PD_COLLATE "},
+ {PD_PRINTTOFILE, "PD_PRINTTOFILE "},
+ {PD_PRINTSETUP, "PD_PRINTSETUP "},
+ {PD_NOWARNING, "PD_NOWARNING "},
+ {PD_RETURNDC, "PD_RETURNDC "},
+ {PD_RETURNIC, "PD_RETURNIC "},
+ {PD_RETURNDEFAULT, "PD_RETURNDEFAULT "},
+ {PD_SHOWHELP, "PD_SHOWHELP "},
+ {PD_ENABLEPRINTHOOK, "PD_ENABLEPRINTHOOK "},
+ {PD_ENABLESETUPHOOK, "PD_ENABLESETUPHOOK "},
+ {PD_ENABLEPRINTTEMPLATE, "PD_ENABLEPRINTTEMPLATE "},
+ {PD_ENABLESETUPTEMPLATE, "PD_ENABLESETUPTEMPLATE "},
+ {PD_ENABLEPRINTTEMPLATEHANDLE, "PD_ENABLEPRINTTEMPLATEHANDLE "},
+ {PD_ENABLESETUPTEMPLATEHANDLE, "PD_ENABLESETUPTEMPLATEHANDLE "},
+ {PD_USEDEVMODECOPIES, "PD_USEDEVMODECOPIES[ANDCOLLATE] "},
+ {PD_DISABLEPRINTTOFILE, "PD_DISABLEPRINTTOFILE "},
+ {PD_HIDEPRINTTOFILE, "PD_HIDEPRINTTOFILE "},
+ {PD_NONETWORKBUTTON, "PD_NONETWORKBUTTON "},
+ {-1, NULL}
+};
+
+/* Debugging info */
+static struct pd_flags psd_flags[] = {
+ {PSD_MINMARGINS,"PSD_MINMARGINS"},
+ {PSD_MARGINS,"PSD_MARGINS"},
+ {PSD_INTHOUSANDTHSOFINCHES,"PSD_INTHOUSANDTHSOFINCHES"},
+ {PSD_INHUNDREDTHSOFMILLIMETERS,"PSD_INHUNDREDTHSOFMILLIMETERS"},
+ {PSD_DISABLEMARGINS,"PSD_DISABLEMARGINS"},
+ {PSD_DISABLEPRINTER,"PSD_DISABLEPRINTER"},
+ {PSD_NOWARNING,"PSD_NOWARNING"},
+ {PSD_DISABLEORIENTATION,"PSD_DISABLEORIENTATION"},
+ {PSD_RETURNDEFAULT,"PSD_RETURNDEFAULT"},
+ {PSD_DISABLEPAPER,"PSD_DISABLEPAPER"},
+ {PSD_SHOWHELP,"PSD_SHOWHELP"},
+ {PSD_ENABLEPAGESETUPHOOK,"PSD_ENABLEPAGESETUPHOOK"},
+ {PSD_ENABLEPAGESETUPTEMPLATE,"PSD_ENABLEPAGESETUPTEMPLATE"},
+ {PSD_ENABLEPAGESETUPTEMPLATEHANDLE,"PSD_ENABLEPAGESETUPTEMPLATEHANDLE"},
+ {PSD_ENABLEPAGEPAINTHOOK,"PSD_ENABLEPAGEPAINTHOOK"},
+ {PSD_DISABLEPAGEPAINTING,"PSD_DISABLEPAGEPAINTING"},
+ {-1, NULL}
+};
+
+/* Internal Functions
+ * Do not Export to other applications or dlls
+ */
+
+BOOL PRINTDLG_GetDefaultPrinterNameA(LPSTR buf, DWORD len);
+INT PRINTDLG_SetUpPrinterListComboA(HWND hDlg, UINT id, LPCSTR name);
+BOOL PRINTDLG_ChangePrinterA(HWND hDlg, char *name,
+ PRINT_PTRA *PrintStructures);
+BOOL PRINTDLG_OpenDefaultPrinter(HANDLE *hprn);
+LRESULT PRINTDLG_WMCommandA(HWND hDlg, WPARAM wParam,
+ LPARAM lParam, PRINT_PTRA* PrintStructures);
+
+#endif /* _WINE_PRINTDLG_H */
+
--- /dev/null Mon Jul 28 00:28:03 2003
+++ printdlg16.c Mon Jul 28 00:20:16 2003
@@ -0,0 +1,580 @@
+/*
+ * COMMDLG - Print Dialog
+ *
+ * Copyright 1994 Martin Ayotte
+ * Copyright 1996 Albrecht Kleine
+ * Copyright 1999 Klaas van Gend
+ * Copyright 2000 Huw D M Davies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define NONAMELESSUNION
+#define NONAMELESSSTRUCT
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "wine/wingdi16.h"
+#include "winuser.h"
+#include "wine/winuser16.h"
+#include "commdlg.h"
+#include "dlgs.h"
+#include "wine/debug.h"
+#include "cderr.h"
+#include "winspool.h"
+#include "winerror.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(commdlg);
+
+#include "cdlg.h"
+#include "printdlg.h"
+
+static BOOL PRINTDLG_CreateDevNames16(HGLOBAL16 *hmem, char* DeviceDriverName,
+ char* DeviceName, char* OutputPort)
+{
+ long size;
+ char* pDevNamesSpace;
+ char* pTempPtr;
+ LPDEVNAMES lpDevNames;
+ char buf[260];
+
+ size = strlen(DeviceDriverName) + 1
+ + strlen(DeviceName) + 1
+ + strlen(OutputPort) + 1
+ + sizeof(DEVNAMES);
+
+ if(*hmem)
+ *hmem = GlobalReAlloc16(*hmem, size, GMEM_MOVEABLE);
+ else
+ *hmem = GlobalAlloc16(GMEM_MOVEABLE, size);
+ if (*hmem == 0)
+ return FALSE;
+
+ pDevNamesSpace = GlobalLock16(*hmem);
+ lpDevNames = (LPDEVNAMES) pDevNamesSpace;
+
+ pTempPtr = pDevNamesSpace + sizeof(DEVNAMES);
+ strcpy(pTempPtr, DeviceDriverName);
+ lpDevNames->wDriverOffset = pTempPtr - pDevNamesSpace;
+
+ pTempPtr += strlen(DeviceDriverName) + 1;
+ strcpy(pTempPtr, DeviceName);
+ lpDevNames->wDeviceOffset = pTempPtr - pDevNamesSpace;
+
+ pTempPtr += strlen(DeviceName) + 1;
+ strcpy(pTempPtr, OutputPort);
+ lpDevNames->wOutputOffset = pTempPtr - pDevNamesSpace;
+
+ PRINTDLG_GetDefaultPrinterNameA(buf, sizeof(buf));
+ lpDevNames->wDefault = (strcmp(buf, DeviceName) == 0) ? 1 : 0;
+ GlobalUnlock16(*hmem);
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * PRINTDLG_WMInitDialog [internal]
+ */
+static LRESULT PRINTDLG_WMInitDialog16(HWND hDlg, WPARAM wParam,
+ PRINT_PTRA* PrintStructures)
+{
+ LPPRINTDLG16 lppd = PrintStructures->dlg.lpPrintDlg16;
+ DEVNAMES *pdn;
+ DEVMODEA *pdm;
+ char *name = NULL;
+ UINT comboID = (lppd->Flags & PD_PRINTSETUP) ? cmb1 : cmb4;
+
+ /* load Collate ICONs */
+ PrintStructures->hCollateIcon =
+ LoadIconA(COMDLG32_hInstance, "PD32_COLLATE");
+ PrintStructures->hNoCollateIcon =
+ LoadIconA(COMDLG32_hInstance, "PD32_NOCOLLATE");
+ if(PrintStructures->hCollateIcon == 0 ||
+ PrintStructures->hNoCollateIcon == 0) {
+ ERR("no icon in resourcefile\n");
+ COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+ EndDialog(hDlg, FALSE);
+ }
+
+ /* load Paper Orientation ICON */
+ /* FIXME: not implemented yet */
+
+ /*
+ * if lppd->Flags PD_SHOWHELP is specified, a HELPMESGSTRING message
+ * must be registered and the Help button must be shown.
+ */
+ if (lppd->Flags & PD_SHOWHELP) {
+ if((PrintStructures->HelpMessageID =
+ RegisterWindowMessageA(HELPMSGSTRINGA)) == 0) {
+ COMDLG32_SetCommDlgExtendedError(CDERR_REGISTERMSGFAIL);
+ return FALSE;
+ }
+ } else
+ PrintStructures->HelpMessageID = 0;
+
+ if (!(lppd->Flags & PD_PRINTSETUP)) {
+ /* We have a print quality combo box. What shall we do? */
+ if (GetDlgItem(hDlg,cmb1)) {
+ char buf [20];
+
+ FIXME("Print quality only displaying currently.\n");
+
+ pdm = GlobalLock16(lppd->hDevMode);
+ if(pdm) {
+ switch (pdm->dmPrintQuality) {
+ case DMRES_HIGH : strcpy(buf,"High");break;
+ case DMRES_MEDIUM : strcpy(buf,"Medium");break;
+ case DMRES_LOW : strcpy(buf,"Low");break;
+ case DMRES_DRAFT : strcpy(buf,"Draft");break;
+ case 0 : strcpy(buf,"Default");break;
+ default : sprintf(buf,"%ddpi",pdm->dmPrintQuality);break;
+ }
+ GlobalUnlock16(lppd->hDevMode);
+ } else
+ strcpy(buf,"Default");
+ SendDlgItemMessageA(hDlg,cmb1,CB_ADDSTRING,0,(LPARAM)buf);
+ SendDlgItemMessageA(hDlg,cmb1,CB_SETCURSEL,0,0);
+ EnableWindow(GetDlgItem(hDlg,cmb1),FALSE);
+ }
+ }
+
+ /* FIXME: I allow more freedom than either Win95 or WinNT,
+ * which do not agree to what errors should be thrown or not
+ * in case nToPage or nFromPage is out-of-range.
+ */
+ if (lppd->nMaxPage < lppd->nMinPage)
+ lppd->nMaxPage = lppd->nMinPage;
+ if (lppd->nMinPage == lppd->nMaxPage)
+ lppd->Flags |= PD_NOPAGENUMS;
+ if (lppd->nToPage < lppd->nMinPage)
+ lppd->nToPage = lppd->nMinPage;
+ if (lppd->nToPage > lppd->nMaxPage)
+ lppd->nToPage = lppd->nMaxPage;
+ if (lppd->nFromPage < lppd->nMinPage)
+ lppd->nFromPage = lppd->nMinPage;
+ if (lppd->nFromPage > lppd->nMaxPage)
+ lppd->nFromPage = lppd->nMaxPage;
+
+ /* If the printer combo box is in the dialog, fill it */
+ if (GetDlgItem(hDlg,comboID)) {
+ /* Fill Combobox
+ */
+ pdn = GlobalLock16(lppd->hDevNames);
+ pdm = GlobalLock16(lppd->hDevMode);
+ if(pdn)
+ name = (char*)pdn + pdn->wDeviceOffset;
+ else if(pdm)
+ name = pdm->dmDeviceName;
+ PRINTDLG_SetUpPrinterListComboA(hDlg, comboID, name);
+ if(pdm) GlobalUnlock16(lppd->hDevMode);
+ if(pdn) GlobalUnlock16(lppd->hDevNames);
+
+ /* Now find selected printer and update rest of dlg */
+ name = HeapAlloc(GetProcessHeap(),0,256);
+ if (GetDlgItemTextA(hDlg, comboID, name, 255))
+ PRINTDLG_ChangePrinterA(hDlg, name, PrintStructures);
+ } else {
+ /* else just use default printer */
+ char name[200];
+ BOOL ret = PRINTDLG_GetDefaultPrinterNameA(name, sizeof(name));
+
+ if (ret)
+ PRINTDLG_ChangePrinterA(hDlg, name, PrintStructures);
+ else
+ FIXME("No default printer found, expect problems!\n");
+ }
+ HeapFree(GetProcessHeap(),0,name);
+
+ return TRUE;
+}
+
+/************************************************************
+ *
+ * PRINTDLG_Get16TemplateFrom32 [Internal]
+ * Generates a 16 bits template from the Wine 32 bits resource
+ *
+ */
+static HGLOBAL16 PRINTDLG_Get16TemplateFrom32(char *PrintResourceName)
+{
+ HRSRC hResInfo;
+ HGLOBAL hDlgTmpl32;
+ LPCVOID template32;
+ DWORD size;
+ HGLOBAL16 hGlobal16;
+ LPVOID template;
+
+ if (!(hResInfo = FindResourceA(COMDLG32_hInstance,
+ PrintResourceName, RT_DIALOGA)))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_FINDRESFAILURE);
+ return 0;
+ }
+ if (!(hDlgTmpl32 = LoadResource(COMDLG32_hInstance, hResInfo )) ||
+ !(template32 = LockResource( hDlgTmpl32 )))
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+ return 0;
+ }
+ size = SizeofResource(COMDLG32_hInstance, hResInfo);
+ hGlobal16 = GlobalAlloc16(0, size);
+ if (!hGlobal16)
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_MEMALLOCFAILURE);
+ ERR("alloc failure for %ld bytes\n", size);
+ return 0;
+ }
+ template = GlobalLock16(hGlobal16);
+ if (!template)
+ {
+ COMDLG32_SetCommDlgExtendedError(CDERR_MEMLOCKFAILURE);
+ ERR("global lock failure for %x handle\n", hGlobal16);
+ GlobalFree16(hGlobal16);
+ return 0;
+ }
+ ConvertDialog32To16((LPVOID)template32, size, (LPVOID)template);
+ GlobalUnlock16(hGlobal16);
+ return hGlobal16;
+}
+
+static BOOL PRINTDLG_CreateDC16(LPPRINTDLG16 lppd)
+{
+ DEVNAMES *pdn = GlobalLock16(lppd->hDevNames);
+ DEVMODEA *pdm = GlobalLock16(lppd->hDevMode);
+
+ if(lppd->Flags & PD_RETURNDC) {
+ lppd->hDC = HDC_16(CreateDCA((char*)pdn + pdn->wDriverOffset,
+ (char*)pdn + pdn->wDeviceOffset,
+ (char*)pdn + pdn->wOutputOffset,
+ pdm ));
+ } else if(lppd->Flags & PD_RETURNIC) {
+ lppd->hDC = HDC_16(CreateICA((char*)pdn + pdn->wDriverOffset,
+ (char*)pdn + pdn->wDeviceOffset,
+ (char*)pdn + pdn->wOutputOffset,
+ pdm ));
+ }
+ GlobalUnlock16(lppd->hDevNames);
+ GlobalUnlock16(lppd->hDevMode);
+ return lppd->hDC ? TRUE : FALSE;
+}
+
+/************************************************************
+ *
+ * PRINTDLG_GetDlgTemplate
+ *
+ */
+static HGLOBAL16 PRINTDLG_GetDlgTemplate16(PRINTDLG16 *lppd)
+{
+ HGLOBAL16 hDlgTmpl, hResInfo;
+
+ if (lppd->Flags & PD_PRINTSETUP) {
+ if(lppd->Flags & PD_ENABLESETUPTEMPLATEHANDLE) {
+ hDlgTmpl = lppd->hSetupTemplate;
+ } else if(lppd->Flags & PD_ENABLESETUPTEMPLATE) {
+ hResInfo = FindResource16(lppd->hInstance,
+ MapSL(lppd->lpSetupTemplateName), RT_DIALOGA);
+ hDlgTmpl = LoadResource16(lppd->hInstance, hResInfo);
+ } else {
+ hDlgTmpl = PRINTDLG_Get16TemplateFrom32("PRINT32_SETUP");
+ }
+ } else {
+ if(lppd->Flags & PD_ENABLEPRINTTEMPLATEHANDLE) {
+ hDlgTmpl = lppd->hPrintTemplate;
+ } else if(lppd->Flags & PD_ENABLEPRINTTEMPLATE) {
+ hResInfo = FindResource16(lppd->hInstance,
+ MapSL(lppd->lpPrintTemplateName),
+ RT_DIALOGA);
+ hDlgTmpl = LoadResource16(lppd->hInstance, hResInfo);
+ } else {
+ hDlgTmpl = PRINTDLG_Get16TemplateFrom32("PRINT32");
+ }
+ }
+ return hDlgTmpl;
+}
+
+/***********************************************************************
+ * PrintDlg (COMMDLG.20)
+ *
+ * Displays the the PRINT dialog box, which enables the user to specify
+ * specific properties of the print job.
+ *
+ * RETURNS
+ * nonzero if the user pressed the OK button
+ * zero if the user cancelled the window or an error occurred
+ *
+ * BUGS
+ * * calls up to the 32-bit versions of the Dialogs, which look different
+ * * Customizing is *not* implemented.
+ */
+
+BOOL16 WINAPI PrintDlg16(
+ LPPRINTDLG16 lppd /* [in/out] ptr to PRINTDLG struct */
+) {
+ BOOL bRet = FALSE;
+ LPVOID ptr;
+ HINSTANCE16 hInst = GetWindowWord( HWND_32(lppd->hwndOwner), GWL_HINSTANCE );
+
+ if(TRACE_ON(commdlg)) {
+ char flagstr[1000] = "";
+ struct pd_flags *pflag = pd_flags;
+ for( ; pflag->name; pflag++) {
+ if(lppd->Flags & pflag->flag)
+ strcat(flagstr, pflag->name);
+ }
+ TRACE("(%p): hwndOwner = %08x, hDevMode = %08x, hDevNames = %08x\n"
+ "pp. %d-%d, min p %d, max p %d, copies %d, hinst %08x\n"
+ "flags %08lx (%s)\n",
+ lppd, lppd->hwndOwner, lppd->hDevMode, lppd->hDevNames,
+ lppd->nFromPage, lppd->nToPage, lppd->nMinPage, lppd->nMaxPage,
+ lppd->nCopies, lppd->hInstance, lppd->Flags, flagstr);
+ }
+
+ if(lppd->lStructSize != sizeof(PRINTDLG16)) {
+ ERR("structure size (%ld/%d)\n",lppd->lStructSize,sizeof(PRINTDLG16));
+ COMDLG32_SetCommDlgExtendedError(CDERR_STRUCTSIZE);
+ return FALSE;
+ }
+
+ if(lppd->Flags & PD_RETURNDEFAULT) {
+ PRINTER_INFO_2A *pbuf;
+ DRIVER_INFO_3A *dbuf;
+ HANDLE hprn;
+ DWORD needed;
+
+ if(lppd->hDevMode || lppd->hDevNames) {
+ WARN("hDevMode or hDevNames non-zero for PD_RETURNDEFAULT\n");
+ COMDLG32_SetCommDlgExtendedError(PDERR_RETDEFFAILURE);
+ return FALSE;
+ }
+ if(!PRINTDLG_OpenDefaultPrinter(&hprn)) {
+ WARN("Can't find default printer\n");
+ COMDLG32_SetCommDlgExtendedError(PDERR_NODEFAULTPRN);
+ return FALSE;
+ }
+
+ 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),
+ dbuf->pDriverPath,
+ pbuf->pPrinterName,
+ pbuf->pPortName);
+ lppd->hDevMode = GlobalAlloc16(GMEM_MOVEABLE,pbuf->pDevMode->dmSize+
+ pbuf->pDevMode->dmDriverExtra);
+ ptr = GlobalLock16(lppd->hDevMode);
+ memcpy(ptr, pbuf->pDevMode, pbuf->pDevMode->dmSize +
+ pbuf->pDevMode->dmDriverExtra);
+ GlobalUnlock16(lppd->hDevMode);
+ HeapFree(GetProcessHeap(), 0, pbuf);
+ HeapFree(GetProcessHeap(), 0, dbuf);
+ bRet = TRUE;
+ } else {
+ HGLOBAL16 hDlgTmpl;
+ PRINT_PTRA *PrintStructures;
+
+ /* load Dialog resources,
+ * depending on Flags indicates Print32 or Print32_setup dialog
+ */
+ hDlgTmpl = PRINTDLG_GetDlgTemplate16(lppd);
+ if (!hDlgTmpl) {
+ COMDLG32_SetCommDlgExtendedError(CDERR_LOADRESFAILURE);
+ return FALSE;
+ }
+ PrintStructures = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(PRINT_PTRA));
+ PrintStructures->dlg.lpPrintDlg16 = lppd;
+ PrintStructures->dlg.lpPrintDlg = (LPPRINTDLGA)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(PRINTDLGA));
+#define CVAL(x) PrintStructures->dlg.lpPrintDlg->x = lppd->x;
+#define MVAL(x) PrintStructures->dlg.lpPrintDlg->x = MapSL(lppd->x);
+ CVAL(Flags);
+ PrintStructures->dlg.lpPrintDlg->hwndOwner = HWND_32(lppd->hwndOwner);
+ PrintStructures->dlg.lpPrintDlg->hDC = HDC_32(lppd->hDC);
+ CVAL(nFromPage);CVAL(nToPage);CVAL(nMinPage);CVAL(nMaxPage);
+ CVAL(nCopies);
+ PrintStructures->dlg.lpPrintDlg->hInstance = HINSTANCE_32(lppd->hInstance);
+ CVAL(lCustData);
+ MVAL(lpPrintTemplateName);MVAL(lpSetupTemplateName);
+ /* Don't copy rest, it is 16 bit specific */
+#undef MVAL
+#undef CVAL
+
+ PrintStructures->lpDevMode = HeapAlloc(GetProcessHeap(),0,sizeof(DEVMODEA));
+
+ /* and create & process the dialog .
+ * -1 is failure, 0 is broken hwnd, everything else is ok.
+ */
+ bRet = (0<DialogBoxIndirectParam16(
+ hInst, hDlgTmpl, lppd->hwndOwner,
+ (DLGPROC16)GetProcAddress16(GetModuleHandle16("COMMDLG"),(LPCSTR)21),
+ (LPARAM)PrintStructures
+ )
+ );
+ if (!PrintStructures->lpPrinterInfo) bRet = FALSE;
+ 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");
+ lppd->hDevMode = GlobalAlloc16(GMEM_MOVEABLE,
+ lpdm->dmSize + lpdm->dmDriverExtra);
+ } else {
+ WORD locks;
+ if((locks = (GlobalFlags16(lppd->hDevMode)&GMEM_LOCKCOUNT))) {
+ WARN("hDevMode has %d locks on it. Unlocking it now\n", locks);
+ while(locks--) {
+ GlobalUnlock16(lppd->hDevMode);
+ TRACE("Now got %d locks\n", locks);
+ }
+ }
+ lppd->hDevMode = GlobalReAlloc16(lppd->hDevMode,
+ lpdm->dmSize + lpdm->dmDriverExtra,
+ GMEM_MOVEABLE);
+ }
+ lpdmReturn = GlobalLock16(lppd->hDevMode);
+ memcpy(lpdmReturn, lpdm, lpdm->dmSize + lpdm->dmDriverExtra);
+
+ if (lppd->hDevNames != 0) {
+ WORD locks;
+ if((locks = (GlobalFlags16(lppd->hDevNames)&GMEM_LOCKCOUNT))) {
+ WARN("hDevNames has %d locks on it. Unlocking it now\n", locks);
+ while(locks--)
+ GlobalUnlock16(lppd->hDevNames);
+ }
+ }
+ 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))
+ bRet = PRINTDLG_CreateDC16(lppd);
+
+ TRACE("exit! (%d)\n", bRet);
+ return bRet;
+}
+
+/**********************************************************************
+ *
+ * 16 bit commdlg
+ */
+
+/***********************************************************************
+ * PrintDlgProc (COMMDLG.21)
+ */
+BOOL16 CALLBACK PrintDlgProc16(HWND16 hDlg16, UINT16 uMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ HWND hDlg = HWND_32(hDlg16);
+ PRINT_PTRA* PrintStructures;
+ BOOL16 res = FALSE;
+
+ if (uMsg!=WM_INITDIALOG) {
+ PrintStructures = (PRINT_PTRA*)GetPropA(hDlg,"__WINE_PRINTDLGDATA");
+ if (!PrintStructures)
+ return FALSE;
+ } else {
+ PrintStructures = (PRINT_PTRA*) lParam;
+ SetPropA(hDlg,"__WINE_PRINTDLGDATA",PrintStructures);
+ res = PRINTDLG_WMInitDialog16(hDlg, wParam, PrintStructures);
+
+ if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) {
+ res = CallWindowProc16(
+ (WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook,
+ hDlg16, uMsg, wParam, (LPARAM)PrintStructures->dlg.lpPrintDlg16
+ );
+ }
+ return res;
+ }
+
+ if(PrintStructures->dlg.lpPrintDlg16->Flags & PD_ENABLEPRINTHOOK) {
+ res = CallWindowProc16(
+ (WNDPROC16)PrintStructures->dlg.lpPrintDlg16->lpfnPrintHook,
+ hDlg16,uMsg, wParam, lParam
+ );
+ if(LOWORD(res)) return res;
+ }
+
+ switch (uMsg) {
+ case WM_COMMAND: {
+ /* We need to map those for the 32bit window procedure, compare
+ * with 32Ato16 mapper in winproc.c
+ */
+ return PRINTDLG_WMCommandA(
+ hDlg,
+ MAKEWPARAM(wParam,HIWORD(lParam)),
+ LOWORD(lParam),
+ PrintStructures
+ );
+ }
+ case WM_DESTROY:
+ DestroyIcon(PrintStructures->hCollateIcon);
+ DestroyIcon(PrintStructures->hNoCollateIcon);
+ /* FIXME: don't forget to delete the paper orientation icons here! */
+
+ return FALSE;
+ }
+ return res;
+}
+
+/***********************************************************************
+ * PrintSetupDlgProc (COMMDLG.22)
+ */
+BOOL16 CALLBACK PrintSetupDlgProc16(HWND16 hWnd16, UINT16 wMsg, WPARAM16 wParam,
+ LPARAM lParam)
+{
+ HWND hWnd = HWND_32(hWnd16);
+ switch (wMsg)
+ {
+ case WM_INITDIALOG:
+ TRACE("WM_INITDIALOG lParam=%08lX\n", lParam);
+ ShowWindow(hWnd, SW_SHOWNORMAL);
+ return (TRUE);
+ case WM_COMMAND:
+ switch (wParam) {
+ case IDOK:
+ EndDialog(hWnd, TRUE);
+ return(TRUE);
+ case IDCANCEL:
+ EndDialog(hWnd, FALSE);
+ return(TRUE);
+ }
+ return(FALSE);
+ }
+ return FALSE;
+}
More information about the wine-patches
mailing list