-- v2: wineps.drv: Remove DrvDocumentProperties entry point. winspool.drv: Use DrvDocumentPropertySheets driver entry in DocumentProperties. wineps.drv: Add DrvDocumentPropertySheets implementation.
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/driver.c | 101 ++++++++++++++++++++++++++++++++ dlls/wineps.drv/wineps.drv.spec | 1 + 2 files changed, 102 insertions(+)
diff --git a/dlls/wineps.drv/driver.c b/dlls/wineps.drv/driver.c index 3b0300f3fd2..1c4b6f2bb30 100644 --- a/dlls/wineps.drv/driver.c +++ b/dlls/wineps.drv/driver.c @@ -23,6 +23,7 @@ */
#include <stdarg.h> +#include <stdlib.h>
#include "windef.h" #include "winbase.h" @@ -39,6 +40,18 @@
WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
+typedef struct +{ + WORD cbSize; + WORD Reserved; + HANDLE hPrinter; + LPCWSTR pszPrinterName; + PDEVMODEW pdmIn; + PDEVMODEW pdmOut; + DWORD cbOut; + DWORD fMode; +} DOCUMENTPROPERTYHEADERW; + /* convert points to paper size units (10th of a millimeter) */ static inline int paper_size_from_points( float size ) { @@ -521,6 +534,94 @@ INT WINAPI DrvDocumentProperties(HWND hwnd, const WCHAR *device, DEVMODEW *outpu return IDOK; }
+/****************************************************************************** + * DrvDocumentPropertySheets (wineps.drv.@) + */ +LONG WINAPI DrvDocumentPropertySheets(PROPSHEETUI_INFO *info, LPARAM lparam) +{ + DOCUMENTPROPERTYHEADERW *dph; + PRINTERINFO *pi; + + TRACE("(info=%p, lparam=%ld)\n", info, lparam); + + dph = (DOCUMENTPROPERTYHEADERW *)(info ? info->lParamInit : lparam); + + if (!(pi = PSDRV_FindPrinterInfo(dph->pszPrinterName))) return ERR_CPSUI_GETLASTERROR; + + if (!info || info->Reason == PROPSHEETUI_REASON_INIT) + { + /* If dph->fMode == 0, return size of DEVMODE structure */ + if (!dph->fMode || !dph->pdmOut) + { + dph->cbOut = pi->Devmode->dmPublic.dmSize + pi->Devmode->dmPublic.dmDriverExtra; + return dph->cbOut; + } + + /* If DM_MODIFY is set, change settings in accordance with pdmIn */ + if ((dph->fMode & DM_MODIFY) && dph->pdmIn) + { + TRACE("DM_MODIFY set. devIn->dmFields = %08lx\n", dph->pdmIn->dmFields); + PSDRV_MergeDevmodes(pi->Devmode, (PSDRV_DEVMODE *)dph->pdmIn, pi); + } + + /* If DM_PROMPT is set, present modal dialog box */ + if (dph->fMode & DM_PROMPT) + { + PROPSHEETPAGEW psp; + PSDRV_DLGINFO *di; + + if (!info) + { + ERR("DM_PROMPT passed with NULL PROPSHEETUI_INFO\n"); + return ERR_CPSUI_GETLASTERROR; + } + + di = malloc(sizeof(*di)); + if (!di) + return ERR_CPSUI_ALLOCMEM_FAILED; + info->UserData = (ULONG_PTR)di; + + di->dlgdm = malloc(sizeof(*di->dlgdm)); + if (!di->dlgdm) + return ERR_CPSUI_ALLOCMEM_FAILED; + + memset(&psp,0,sizeof(psp)); + di->pi = pi; + *di->dlgdm = *pi->Devmode; + psp.dwSize = sizeof(psp); + psp.hInstance = PSDRV_hInstance; + psp.pszTemplate = L"PAPER"; + psp.pszIcon = NULL; + psp.pfnDlgProc = PSDRV_PaperDlgProc; + psp.lParam = (LPARAM)di; + + if (!info->pfnComPropSheet(info->hComPropSheet, CPSFUNC_ADD_PROPSHEETPAGEW, (LPARAM)&psp, 0)) + return ERR_CPSUI_GETLASTERROR; + } + } + + if (info && info->Reason == PROPSHEETUI_REASON_DESTROY) + { + if (info->UserData) + free(((PSDRV_DLGINFO *)info->UserData)->dlgdm); + free((void *)info->UserData); + } + + if (!info || (info->Reason == PROPSHEETUI_REASON_DESTROY && lparam)) + { + /* If DM_UPDATE is set, should write settings to environment and initialization file */ + if (dph->fMode & DM_UPDATE) + FIXME("Mode DM_UPDATE. Just do the same as DM_COPY\n"); + + /* If DM_COPY is set, should write settings to pdmOut */ + if (dph->pdmOut && (dph->fMode & (DM_COPY | DM_UPDATE))) + memcpy(dph->pdmOut, &pi->Devmode->dmPublic, + pi->Devmode->dmPublic.dmSize + pi->Devmode->dmPublic.dmDriverExtra); + } + + return CPSUI_OK; +} + /****************************************************************************** * DrvDeviceCapabilities (wineps.drv.@) */ diff --git a/dlls/wineps.drv/wineps.drv.spec b/dlls/wineps.drv/wineps.drv.spec index 470bbd8e5c6..c5775b0328b 100644 --- a/dlls/wineps.drv/wineps.drv.spec +++ b/dlls/wineps.drv/wineps.drv.spec @@ -3,3 +3,4 @@ # Printer driver config exports @ stdcall DrvDeviceCapabilities(ptr wstr long ptr ptr) @ stdcall DrvDocumentProperties(long wstr ptr ptr long) +@ stdcall DrvDocumentPropertySheets(ptr long)
From: Piotr Caban piotr@codeweavers.com
--- dlls/wineps.drv/driver.c | 89 --------------------------------- dlls/wineps.drv/psdlg.h | 1 - dlls/wineps.drv/wineps.drv.spec | 1 - dlls/wineps.drv/wineps.rc | 1 - 4 files changed, 92 deletions(-)
diff --git a/dlls/wineps.drv/driver.c b/dlls/wineps.drv/driver.c index 1c4b6f2bb30..e73272c2079 100644 --- a/dlls/wineps.drv/driver.c +++ b/dlls/wineps.drv/driver.c @@ -445,95 +445,6 @@ static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg, return TRUE; }
- -static HPROPSHEETPAGE (WINAPI *pCreatePropertySheetPage) (LPCPROPSHEETPAGEW); -static int (WINAPI *pPropertySheet) (LPCPROPSHEETHEADERW); - -/****************************************************************************** - * DrvDocumentProperties (wineps.drv.@) - * - * Retrieves or modifies device-initialization information for the PostScript - * driver, or displays a driver-supplied dialog box for configuring the driver. - * - * RETURNS - * Returns size of DEVMODE structure if wMode is 0. Otherwise, IDOK is returned for success - * for both dialog and non-dialog operations. IDCANCEL is returned if the dialog box was cancelled. - * A return value less than zero is returned if a non-dialog operation fails. - * - * BUGS - * - * Just returns default devmode at the moment. No use of initialization file. - */ -INT WINAPI DrvDocumentProperties(HWND hwnd, const WCHAR *device, DEVMODEW *output, - DEVMODEW *input, DWORD mode) -{ - PRINTERINFO *pi; - - TRACE("(hwnd=%p, Device='%s', devOut=%p, devIn=%p, Mode=%04lx)\n", - hwnd, debugstr_w(device), output, input, mode); - - if (!(pi = PSDRV_FindPrinterInfo(device))) return -1; - - /* If mode == 0, return size of DEVMODE structure */ - if (!mode) - return pi->Devmode->dmPublic.dmSize + pi->Devmode->dmPublic.dmDriverExtra; - - /* If DM_MODIFY is set, change settings in accordance with lpdmInput */ - if ((mode & DM_MODIFY) && input) - { - TRACE("DM_MODIFY set. devIn->dmFields = %08lx\n", input->dmFields); - PSDRV_MergeDevmodes(pi->Devmode, (PSDRV_DEVMODE *)input, pi); - } - - /* If DM_PROMPT is set, present modal dialog box */ - if (mode & DM_PROMPT) { - HINSTANCE hinstComctl32; - HPROPSHEETPAGE hpsp[1]; - PROPSHEETPAGEW psp; - PROPSHEETHEADERW psh; - PSDRV_DLGINFO di; - PSDRV_DEVMODE dlgdm; - WCHAR SetupW[64]; - - LoadStringW(PSDRV_hInstance, IDS_SETUP, SetupW, ARRAY_SIZE(SetupW)); - hinstComctl32 = LoadLibraryA("comctl32.dll"); - pCreatePropertySheetPage = (void*)GetProcAddress(hinstComctl32, - "CreatePropertySheetPageW"); - pPropertySheet = (void*)GetProcAddress(hinstComctl32, "PropertySheetW"); - memset(&psp,0,sizeof(psp)); - dlgdm = *pi->Devmode; - di.pi = pi; - di.dlgdm = &dlgdm; - psp.dwSize = sizeof(psp); - psp.hInstance = PSDRV_hInstance; - psp.pszTemplate = L"PAPER"; - psp.pszIcon = NULL; - psp.pfnDlgProc = PSDRV_PaperDlgProc; - psp.lParam = (LPARAM)&di; - hpsp[0] = pCreatePropertySheetPage(&psp); - - memset(&psh, 0, sizeof(psh)); - psh.dwSize = sizeof(psh); - psh.pszCaption = SetupW; - psh.nPages = 1; - psh.hwndParent = hwnd; - psh.phpage = hpsp; - - pPropertySheet(&psh); - - } - - /* If DM_UPDATE is set, should write settings to environment and initialization file */ - if (mode & DM_UPDATE) - FIXME("Mode DM_UPDATE. Just do the same as DM_COPY\n"); - - /* If DM_COPY is set, should write settings to lpdmOutput */ - if (output && (mode & (DM_COPY | DM_UPDATE))) - memcpy( output, &pi->Devmode->dmPublic, - pi->Devmode->dmPublic.dmSize + pi->Devmode->dmPublic.dmDriverExtra ); - return IDOK; -} - /****************************************************************************** * DrvDocumentPropertySheets (wineps.drv.@) */ diff --git a/dlls/wineps.drv/psdlg.h b/dlls/wineps.drv/psdlg.h index b8f4bc3eed8..09ce9012d50 100644 --- a/dlls/wineps.drv/psdlg.h +++ b/dlls/wineps.drv/psdlg.h @@ -32,6 +32,5 @@ #define IDD_QUALITY 112
#define IDS_DPI 1000 -#define IDS_SETUP 1001
#endif /* __WINE_PSDLG_H */ diff --git a/dlls/wineps.drv/wineps.drv.spec b/dlls/wineps.drv/wineps.drv.spec index c5775b0328b..365965c69cf 100644 --- a/dlls/wineps.drv/wineps.drv.spec +++ b/dlls/wineps.drv/wineps.drv.spec @@ -2,5 +2,4 @@
# Printer driver config exports @ stdcall DrvDeviceCapabilities(ptr wstr long ptr ptr) -@ stdcall DrvDocumentProperties(long wstr ptr ptr long) @ stdcall DrvDocumentPropertySheets(ptr long) diff --git a/dlls/wineps.drv/wineps.rc b/dlls/wineps.drv/wineps.rc index 7a657c833e6..35b3e5eb167 100644 --- a/dlls/wineps.drv/wineps.rc +++ b/dlls/wineps.drv/wineps.rc @@ -46,7 +46,6 @@ FONT 8, "MS Shell Dlg" STRINGTABLE { IDS_DPI "#msgctxt#unit: dots/inch#dpi" - IDS_SETUP "Setup" }
LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
From: Piotr Caban piotr@codeweavers.com
--- dlls/winspool.drv/Makefile.in | 2 +- dlls/winspool.drv/info.c | 64 +++++++++++++++++++++++++++++------ 2 files changed, 54 insertions(+), 12 deletions(-)
diff --git a/dlls/winspool.drv/Makefile.in b/dlls/winspool.drv/Makefile.in index b4948ccb5e8..3f6d32cb44d 100644 --- a/dlls/winspool.drv/Makefile.in +++ b/dlls/winspool.drv/Makefile.in @@ -1,7 +1,7 @@ MODULE = winspool.drv UNIXLIB = winspool.so IMPORTLIB = winspool -IMPORTS = user32 gdi32 advapi32 +IMPORTS = user32 gdi32 advapi32 compstui UNIX_CFLAGS = $(CUPS_CFLAGS) UNIX_LIBS = $(APPLICATIONSERVICES_LIBS)
diff --git a/dlls/winspool.drv/info.c b/dlls/winspool.drv/info.c index 3806384ee08..22422f7e966 100644 --- a/dlls/winspool.drv/info.c +++ b/dlls/winspool.drv/info.c @@ -51,6 +51,7 @@ #include "wine/heap.h" #include <wine/unixlib.h>
+#include "ddk/compstui.h" #include "ddk/winsplp.h" #include "wspool.h"
@@ -115,11 +116,27 @@ typedef struct
/* entry points */ DWORD (WINAPI *pDrvDeviceCapabilities)(HANDLE, const WCHAR *, WORD, void *, const DEVMODEW *); - INT (WINAPI *pDrvDocumentProperties)(HWND, const WCHAR *, DEVMODEW *, DEVMODEW *, DWORD); + LONG (WINAPI *pDrvDocumentPropertySheets)(PROPSHEETUI_INFO*, LPARAM);
WCHAR name[1]; } config_module_t;
+typedef struct { + WORD cbSize; + WORD Reserved; + HANDLE hPrinter; + LPCWSTR pszPrinterName; + PDEVMODEW pdmIn; + PDEVMODEW pdmOut; + DWORD cbOut; + DWORD fMode; +} DOCUMENTPROPERTYHEADERW; + +typedef struct { + DOCUMENTPROPERTYHEADERW dph; + config_module_t *config; +} document_property_t; + /* ############################### */
static opened_printer_t **printer_handles; @@ -502,7 +519,7 @@ static config_module_t *get_config_module(const WCHAR *device, BOOL grab) ret->ref = 2; /* one for config_module and one for the caller */ ret->module = driver_module; ret->pDrvDeviceCapabilities = (void *)GetProcAddress(driver_module, "DrvDeviceCapabilities"); - ret->pDrvDocumentProperties = (void *)GetProcAddress(driver_module, "DrvDocumentProperties"); + ret->pDrvDocumentPropertySheets = (void *)GetProcAddress(driver_module, "DrvDocumentPropertySheets"); wcscpy( ret->name, device );
wine_rb_put(&config_modules, ret->name, &ret->entry); @@ -1896,6 +1913,18 @@ LONG WINAPI DocumentPropertiesA(HWND hwnd, HANDLE printer, char *device_name, DE return ret; }
+static LONG WINAPI document_callback(PROPSHEETUI_INFO *info, LPARAM lparam) +{ + if (info->Reason == PROPSHEETUI_REASON_INIT) + { + document_property_t *dp = (document_property_t *)info->lParamInit; + + if (!info->pfnComPropSheet(info->hComPropSheet, CPSFUNC_ADD_PFNPROPSHEETUIW, + (LPARAM)dp->config->pDrvDocumentPropertySheets, (LPARAM)&dp->dph)) + return ERR_CPSUI_GETLASTERROR; + } + return CPSUI_OK; +}
/***************************************************************************** * DocumentPropertiesW (WINSPOOL.@) @@ -1905,8 +1934,8 @@ LONG WINAPI DocumentPropertiesW(HWND hWnd, HANDLE hPrinter, LPDEVMODEW pDevModeOutput, LPDEVMODEW pDevModeInput, DWORD fMode) { - config_module_t *config = NULL; - const WCHAR *device = NULL; + document_property_t dp; + const WCHAR *device; LONG ret;
TRACE("(%p,%p,%s,%p,%p,%ld)\n", @@ -1918,17 +1947,30 @@ LONG WINAPI DocumentPropertiesW(HWND hWnd, HANDLE hPrinter, return -1; }
- config = get_config_module(device, TRUE); - if (!config) { + dp.dph.cbSize = sizeof(dp.dph); + dp.dph.Reserved = 0; + dp.dph.hPrinter = hPrinter; + dp.dph.pszPrinterName = device; + dp.dph.pdmIn = pDevModeInput; + dp.dph.pdmOut = pDevModeOutput; + dp.dph.cbOut = dp.dph.pdmOut ? dp.dph.pdmOut->dmSize : 0; + dp.dph.fMode = fMode; + dp.config = get_config_module(device, TRUE); + if (!dp.config) { ERR("Could not load config module for %s\n", debugstr_w(device)); return -1; }
- /* FIXME: This uses Wine-specific config file entry point. - * We should use DrvDevicePropertySheets instead (requires CPSUI support first). - */ - ret = config->pDrvDocumentProperties(hWnd, device, pDevModeOutput, pDevModeInput, fMode); - release_config_module(config); + if (!(fMode & ~(DM_IN_BUFFER | DM_OUT_BUFFER | DM_OUT_DEFAULT))) { + ret = dp.config->pDrvDocumentPropertySheets(NULL, (LPARAM)&dp.dph); + + if ((!fMode || !pDevModeOutput) && dp.dph.cbOut != ret) + FIXME("size mismatch: ret = %ld cbOut = %ld\n", ret, dp.dph.cbOut); + } else { + ret = CommonPropertySheetUIW(hWnd, document_callback, (LPARAM)&dp, NULL); + } + + release_config_module(dp.config); return ret; }