Huw Davies : comdlg32: Move invocation of the Printer... dialog to a separate function.

Alexandre Julliard julliard at winehq.org
Wed Jan 21 06:39:54 CST 2009


Module: wine
Branch: master
Commit: b2258d8324aeb594a71679d3714a95defbee5610
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=b2258d8324aeb594a71679d3714a95defbee5610

Author: Huw Davies <huw at codeweavers.com>
Date:   Wed Jan 21 10:45:19 2009 +0000

comdlg32: Move invocation of the Printer... dialog to a separate function.

---

 dlls/comdlg32/printdlg.c |   95 +++++++++++++++++++++++++++++++++++++---------
 1 files changed, 77 insertions(+), 18 deletions(-)

diff --git a/dlls/comdlg32/printdlg.c b/dlls/comdlg32/printdlg.c
index 2b939f3..412c343 100644
--- a/dlls/comdlg32/printdlg.c
+++ b/dlls/comdlg32/printdlg.c
@@ -2638,6 +2638,25 @@ static void pagesetup_set_defaultsource(PageSetupDataA *pda, WORD source)
     GlobalUnlock(pda->dlga->hDevMode);
 }
 
+static WCHAR *pagesetup_get_drvname(const PageSetupDataA *pda)
+{
+    DEVNAMES *dn;
+    int len;
+    WCHAR *name;
+
+    dn = GlobalLock(pda->dlga->hDevNames);
+    len = MultiByteToWideChar(CP_ACP, 0, (char*)dn + dn->wDriverOffset, -1, NULL, 0);
+    name = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+    MultiByteToWideChar(CP_ACP, 0, (char*)dn + dn->wDriverOffset, -1, name, len);
+    GlobalUnlock(pda->dlga->hDevNames);
+    return name;
+}
+
+static void pagesetup_release_drvname(const PageSetupDataA *pda, WCHAR *name)
+{
+    HeapFree(GetProcessHeap(), 0, name);
+}
+
 static WCHAR *pagesetup_get_devname(const PageSetupDataA *pda)
 {
     DEVNAMES *dn;
@@ -2941,6 +2960,59 @@ static void pagesetup_init_combos(HWND hDlg, PageSetupDataA *pda)
     pagesetup_release_devmode(pda, dm);
 }
 
+
+/****************************************************************************************
+ *  pagesetup_change_printer_dialog
+ *
+ *  Pops up another dialog that lets the user pick another printer.
+ *
+ *  For now we display the PrintDlg, this should display a striped down version of it.
+ */
+static void pagesetup_change_printer_dialog(HWND hDlg, PageSetupDataA *pda)
+{
+    PRINTDLGW prnt;
+    LPWSTR drvname, devname, portname;
+    DEVMODEW *tmp_dm, *dm;
+
+    memset(&prnt, 0, sizeof(prnt));
+    prnt.lStructSize = sizeof(prnt);
+    prnt.Flags     = 0;
+    prnt.hwndOwner = hDlg;
+
+    drvname = pagesetup_get_drvname(pda);
+    devname = pagesetup_get_devname(pda);
+    portname = pagesetup_get_portname(pda);
+    prnt.hDevNames = 0;
+    PRINTDLG_CreateDevNamesW(&prnt.hDevNames, drvname, devname, portname);
+    pagesetup_release_portname(pda, portname);
+    pagesetup_release_devname(pda, devname);
+    pagesetup_release_drvname(pda, drvname);
+
+    tmp_dm = pagesetup_get_devmode(pda);
+    prnt.hDevMode = GlobalAlloc(GMEM_MOVEABLE, tmp_dm->dmSize + tmp_dm->dmDriverExtra);
+    dm = GlobalLock(prnt.hDevMode);
+    memcpy(dm, tmp_dm, tmp_dm->dmSize + tmp_dm->dmDriverExtra);
+    GlobalUnlock(prnt.hDevMode);
+    pagesetup_release_devmode(pda, tmp_dm);
+
+    if (PrintDlgW(&prnt))
+    {
+        DEVMODEW *dm = GlobalLock(prnt.hDevMode);
+        DEVNAMES *dn = GlobalLock(prnt.hDevNames);
+
+        pagesetup_set_devnames(pda, (WCHAR*)dn + dn->wDriverOffset,
+                               (WCHAR*)dn + dn->wDeviceOffset, (WCHAR *)dn + dn->wOutputOffset);
+        pagesetup_set_devmode(pda, dm);
+        GlobalUnlock(prnt.hDevNames);
+        GlobalUnlock(prnt.hDevMode);
+        pagesetup_init_combos(hDlg, pda);
+    }
+
+    GlobalFree(prnt.hDevMode);
+    GlobalFree(prnt.hDevNames);
+
+}
+
 static void PRINTDLG_PS_SetOrientationW(HWND hDlg, PageSetupDataW* pdw)
 {
     WCHAR PaperName[64];
@@ -3168,25 +3240,12 @@ PRINTDLG_PS_WMCommandA(
         EndDialog(hDlg, FALSE);
 	return FALSE ;
 
-    case psh3:
-    {
-        PRINTDLGA prnt;
-        memset(&prnt, 0, sizeof(prnt));
-        prnt.lStructSize = sizeof(prnt);
-        prnt.Flags     = 0;
-        prnt.hwndOwner = hDlg;
-        prnt.hDevNames = pda->dlga->hDevNames;
-        prnt.hDevMode  = pda->dlga->hDevMode;
-        if (PrintDlgA(&prnt))
-        {
-            pda->dlga->hDevNames = prnt.hDevNames;
-            pda->dlga->hDevMode  = prnt.hDevMode;
-            pagesetup_init_combos(hDlg, pda);
-        }
+    case psh3: /* Printer... */
+        pagesetup_change_printer_dialog(hDlg, pda);
         return TRUE;
-    }
-    case rad1:
-    case rad2:
+
+    case rad1: /* Portrait */
+    case rad2: /* Landscape */
         if((id == rad1 && pagesetup_get_orientation(pda) == DMORIENT_LANDSCAPE) ||
            (id == rad2 && pagesetup_get_orientation(pda) == DMORIENT_PORTRAIT))
 	{




More information about the wine-cvs mailing list