[1/5] wineps.drv: Add an ability to select device resolution from UI. Take 2.
Dmitry Timoshkov
dmitry at baikal.ru
Mon Dec 24 00:53:12 CST 2012
---
dlls/wineps.drv/driver.c | 87 +++++++++++++++++++++++++++++++++++++++++++++--
dlls/wineps.drv/psdlg.h | 4 +++
dlls/wineps.drv/wineps.rc | 10 +++++-
3 files changed, 98 insertions(+), 3 deletions(-)
diff --git a/dlls/wineps.drv/driver.c b/dlls/wineps.drv/driver.c
index 18be8e0..790ed43 100644
--- a/dlls/wineps.drv/driver.c
+++ b/dlls/wineps.drv/driver.c
@@ -224,10 +224,13 @@ typedef struct
static INT_PTR CALLBACK PSDRV_PaperDlgProc(HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
+ static const WCHAR resW[] = {'%','d',0};
+ static const WCHAR resxyW[] = {'%','d','x','%','d',0};
PSDRV_DLGINFO *di;
int i, Cursel;
PAGESIZE *ps;
DUPLEX *duplex;
+ RESOLUTION *res;
switch(msg) {
case WM_INITDIALOG:
@@ -243,7 +246,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 +255,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 +270,57 @@ 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 ))
+ {
+ int len, res;
+ WCHAR buf[256];
+
+ res = di->pi->ppd->DefaultResolution;
+ len = sprintfW(buf, resW, res);
+ buf[len++] = ' ';
+ LoadStringW(PSDRV_hInstance, IDS_DPI, buf + len, sizeof(buf)/sizeof(buf[0]) - len);
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_ADDSTRING, 0, (LPARAM)buf);
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_SETITEMDATA, 0, MAKELONG(res, res));
+ 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)
+ {
+ int len;
+ WCHAR buf[256];
+ DWORD idx;
+
+ if (res->resx == res->resy)
+ len = sprintfW(buf, resW, res->resx);
+ else
+ len = sprintfW(buf, resxyW, res->resx, res->resy);
+ buf[len++] = ' ';
+ LoadStringW(PSDRV_hInstance, IDS_DPI, buf + len, sizeof(buf)/sizeof(buf[0]) - len);
+ idx = SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_ADDSTRING, 0, (LPARAM)buf);
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_SETITEMDATA, idx, MAKELONG(res->resx, res->resy));
+
+ if (res->resx == resx && res->resy == resy)
+ Cursel = idx;
+ }
+ }
+ SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_SETCURSEL, Cursel, 0);
+
break;
case WM_COMMAND:
@@ -307,6 +361,35 @@ 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)
+ {
+ LPARAM data;
+ int resx, resy;
+
+ Cursel = SendDlgItemMessageW(hwnd, LOWORD(wParam), CB_GETCURSEL, 0, 0);
+ data = SendDlgItemMessageW(hwnd, IDD_QUALITY, CB_GETITEMDATA, Cursel, 0);
+
+ resx = LOWORD(data);
+ resy = HIWORD(data);
+ TRACE("Setting resolution to %dx%d\n", resx, resy);
+
+ di->dlgdm->dmPublic.u1.s1.dmPrintQuality = resx;
+ di->dlgdm->dmPublic.dmFields |= DM_PRINTQUALITY;
+
+ di->dlgdm->dmPublic.dmYResolution = resy;
+ di->dlgdm->dmPublic.dmFields |= DM_YRESOLUTION;
+
+ if (di->pi->Devmode->dmPublic.dmFields & DM_LOGPIXELS)
+ {
+ di->dlgdm->dmPublic.dmLogPixels = resx;
+ di->dlgdm->dmPublic.dmFields |= DM_LOGPIXELS;
+ }
+
+ SendMessageW(GetParent(hwnd), PSM_CHANGED, 0, 0);
+ }
+ break;
}
break;
diff --git a/dlls/wineps.drv/psdlg.h b/dlls/wineps.drv/psdlg.h
index 24e4291..09ce901 100644
--- a/dlls/wineps.drv/psdlg.h
+++ b/dlls/wineps.drv/psdlg.h
@@ -29,4 +29,8 @@
#define IDD_ORIENT_LANDSCAPE 102
#define IDD_DUPLEX 110
#define IDD_DUPLEX_NAME 111
+#define IDD_QUALITY 112
+
+#define IDS_DPI 1000
+
#endif /* __WINE_PSDLG_H */
diff --git a/dlls/wineps.drv/wineps.rc b/dlls/wineps.drv/wineps.rc
index 5789b8e..6555bcf 100644
--- a/dlls/wineps.drv/wineps.rc
+++ b/dlls/wineps.drv/wineps.rc
@@ -33,7 +33,15 @@ 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
+}
+
+STRINGTABLE
+{
+ IDS_DPI "#msgctxt#unit: dots/inch#dpi"
}
--
1.8.0.2
More information about the wine-patches
mailing list