[1/2] wineps.drv: Add an ability to select device resolution from UI.
Dmitry Timoshkov
dmitry at baikal.ru
Fri Dec 21 03:52:00 CST 2012
---
dlls/wineps.drv/driver.c | 103 +++++++++++++++++++++++++++++++++++++++++++++-
dlls/wineps.drv/psdlg.h | 1 +
dlls/wineps.drv/wineps.rc | 5 ++-
3 files changed, 106 insertions(+), 3 deletions(-)
diff --git a/dlls/wineps.drv/driver.c b/dlls/wineps.drv/driver.c
index 18be8e0..9d2ca41 100644
--- a/dlls/wineps.drv/driver.c
+++ b/dlls/wineps.drv/driver.c
@@ -216,6 +216,11 @@ typedef struct
PSDRV_DEVMODE *dlgdm;
} PSDRV_DLGINFO;
+struct item_res_data
+{
+ int resx, resy;
+};
+
/****************************************************************
* PSDRV_PaperDlgProc
*
@@ -224,10 +229,13 @@ typedef struct
static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
+ static const WCHAR resW[] = {'%','d',' ','d','p','i',0};
+ static const WCHAR resxyW[] = {'%','d','x','%','d',' ','d','p','i',0};
PSDRV_DLGINFO *di;
int i, Cursel;
PAGESIZE *ps;
DUPLEX *duplex;
+ RESOLUTION *res;
switch(msg) {
case WM_INITDIALOG:
@@ -243,7 +251,7 @@ static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
i++;
}
SendDlgItemMessageA(hwnd, IDD_PAPERS, LB_SETCURSEL, Cursel, 0);
-
+
CheckRadioButton(hwnd, IDD_ORIENT_PORTRAIT, IDD_ORIENT_LANDSCAPE,
di->pi->Devmode->dmPublic.u1.s1.dmOrientation ==
DMORIENT_PORTRAIT ? IDD_ORIENT_PORTRAIT :
@@ -252,7 +260,7 @@ static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
if (list_empty( &di->pi->ppd->Duplexes ))
{
ShowWindow(GetDlgItem(hwnd, IDD_DUPLEX), SW_HIDE);
- ShowWindow(GetDlgItem(hwnd, IDD_DUPLEX_NAME), SW_HIDE);
+ ShowWindow(GetDlgItem(hwnd, IDD_DUPLEX_NAME), SW_HIDE);
}
else
{
@@ -267,6 +275,59 @@ static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
}
SendDlgItemMessageA(hwnd, IDD_DUPLEX, CB_SETCURSEL, Cursel, 0);
}
+
+ if (list_empty( &di->pi->ppd->Resolutions ))
+ {
+ WCHAR buf[64];
+ struct item_res_data *data;
+
+ sprintfW(buf, resW, di->pi->ppd->DefaultResolution);
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_ADDSTRING, 0, (LPARAM)buf);
+
+ data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data));
+ data->resx = data->resy = di->pi->ppd->DefaultResolution;
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_SETITEMDATA, 0, (LPARAM)data);
+ Cursel = 0;
+ }
+ else
+ {
+ int resx, resy;
+
+ Cursel = 0;
+ resx = resy = di->pi->ppd->DefaultResolution;
+
+ if (di->pi->Devmode->dmPublic.dmFields & DM_PRINTQUALITY)
+ resx = resy = di->pi->Devmode->dmPublic.u1.s1.dmPrintQuality;
+
+ if (di->pi->Devmode->dmPublic.dmFields & DM_YRESOLUTION)
+ resy = di->pi->Devmode->dmPublic.dmYResolution;
+
+ if (di->pi->Devmode->dmPublic.dmFields & DM_LOGPIXELS)
+ resx = resy = di->pi->Devmode->dmPublic.dmLogPixels;
+
+ LIST_FOR_EACH_ENTRY(res, &di->pi->ppd->Resolutions, RESOLUTION, entry)
+ {
+ WCHAR buf[64];
+ DWORD idx;
+ struct item_res_data *data;
+
+ if (res->resx == res->resy)
+ sprintfW(buf, resW, res->resx);
+ else
+ sprintfW(buf, resxyW, res->resx, res->resy);
+ idx = SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_ADDSTRING, 0, (LPARAM)buf);
+
+ data = HeapAlloc(GetProcessHeap(), 0, sizeof(*data));
+ data->resx = res->resx;
+ data->resy = res->resy;
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_SETITEMDATA, idx, (LPARAM)data);
+
+ if (res->resx == resx && res->resy == resy)
+ Cursel = idx;
+ }
+ }
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_SETCURSEL, Cursel, 0);
+
break;
case WM_COMMAND:
@@ -307,6 +368,32 @@ static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
SendMessageW(GetParent(hwnd), PSM_CHANGED, 0, 0);
}
break;
+
+ case IDD_QUALITY:
+ if (HIWORD(wParam) == CBN_SELCHANGE)
+ {
+ struct item_res_data *data;
+
+ Cursel = SendDlgItemMessageW(hwnd, LOWORD(wParam), CB_GETCURSEL, 0, 0);
+ data = (struct item_res_data *)SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_GETITEMDATA, Cursel, 0);
+
+ TRACE("Setting resolution to %dx%d\n", data->resx, data->resy);
+
+ di->dlgdm->dmPublic.u1.s1.dmPrintQuality = data->resx;
+ di->dlgdm->dmPublic.dmFields |= DM_PRINTQUALITY;
+
+ di->dlgdm->dmPublic.dmYResolution = data->resy;
+ di->dlgdm->dmPublic.dmFields |= DM_YRESOLUTION;
+
+ if (di->pi->Devmode->dmPublic.dmFields & DM_LOGPIXELS)
+ {
+ di->dlgdm->dmPublic.dmLogPixels = data->resx;
+ di->dlgdm->dmPublic.dmFields |= DM_LOGPIXELS;
+ }
+
+ SendMessageW(GetParent(hwnd), PSM_CHANGED, 0, 0);
+ }
+ break;
}
break;
@@ -326,6 +413,18 @@ static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
break;
}
+ case WM_DESTROY:
+ {
+ DWORD idx = 0;
+ while (1)
+ {
+ void *data = (void *)SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_GETITEMDATA, idx++, 0);
+ if (!data || data == LongToPtr(CB_ERR)) break;
+ HeapFree(GetProcessHeap(), 0, data);
+ }
+ break;
+ }
+
default:
return FALSE;
}
diff --git a/dlls/wineps.drv/psdlg.h b/dlls/wineps.drv/psdlg.h
index 24e4291..13428c9 100644
--- a/dlls/wineps.drv/psdlg.h
+++ b/dlls/wineps.drv/psdlg.h
@@ -29,4 +29,5 @@
#define IDD_ORIENT_LANDSCAPE 102
#define IDD_DUPLEX 110
#define IDD_DUPLEX_NAME 111
+#define IDD_QUALITY 112
#endif /* __WINE_PSDLG_H */
diff --git a/dlls/wineps.drv/wineps.rc b/dlls/wineps.drv/wineps.rc
index 5789b8e..1392f65 100644
--- a/dlls/wineps.drv/wineps.rc
+++ b/dlls/wineps.drv/wineps.rc
@@ -33,7 +33,10 @@ FONT 8, "MS Shell Dlg"
WS_TABSTOP, 20, 93, 180, 10
CONTROL "&Landscape", IDD_ORIENT_LANDSCAPE, "Button", BS_AUTORADIOBUTTON,
20, 110, 180, 10
- LTEXT "Duplex:", IDD_DUPLEX_NAME, 10, 140, 200, 8
+ LTEXT "Duplex:", IDD_DUPLEX_NAME, 10, 140, 200, 8
COMBOBOX IDD_DUPLEX, 10, 151, 200, 40, CBS_DROPDOWNLIST | CBS_HASSTRINGS |
WS_TABSTOP
+ LTEXT "Print Quality:", -1, 10, 170, 200, 8
+ COMBOBOX IDD_QUALITY, 10, 181, 200, 40, CBS_DROPDOWNLIST | CBS_HASSTRINGS |
+ WS_TABSTOP
}
--
1.8.0.2
More information about the wine-patches
mailing list