[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