[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