diff options
author | Rick Yorgason <rick@firefang.com> | 2018-10-27 05:48:34 -0700 |
---|---|---|
committer | Rick Yorgason <rick@firefang.com> | 2019-03-31 13:57:12 -0700 |
commit | 446659e80faa0aebe208dcebee325c0df15c408d (patch) | |
tree | ff84762102af6100e34b7230905aaf37b9c6b21a | |
parent | 426a0be531ce9abab26efba94728fdcc06228af9 (diff) | |
download | gtk+-446659e80faa0aebe208dcebee325c0df15c408d.tar.gz |
Fixed bug that prevented GTK from storing printer driver preferences in the print dialogue on Windows. Also saving devmode->dmDeviceName so the dialogue remembers which printer your selected last, and doesn't try to feed to saved preferences to the wrong printer.
-rw-r--r-- | gtk/gtkprintoperation-win32.c | 102 |
1 files changed, 72 insertions, 30 deletions
diff --git a/gtk/gtkprintoperation-win32.c b/gtk/gtkprintoperation-win32.c index f4142cf145..53dc3b4fb7 100644 --- a/gtk/gtkprintoperation-win32.c +++ b/gtk/gtkprintoperation-win32.c @@ -678,6 +678,7 @@ devmode_to_settings (GtkPrintSettings *settings, HANDLE hDevMode) { LPDEVMODEW devmode; + char *devmode_name; devmode = GlobalLock (hDevMode); @@ -692,6 +693,10 @@ devmode_to_settings (GtkPrintSettings *settings, extra); g_free (extra); } + + devmode_name = g_utf16_to_utf8 (devmode->dmDeviceName, -1, NULL, NULL, NULL); + gtk_print_settings_set (settings, "win32-devmode-name", devmode_name); + g_free (devmode_name); if (devmode->dmFields & DM_ORIENTATION) gtk_print_settings_set_orientation (settings, @@ -936,9 +941,10 @@ dialog_to_print_settings (GtkPrintOperation *op, static HANDLE devmode_from_settings (GtkPrintSettings *settings, - GtkPageSetup *page_setup) + GtkPageSetup *page_setup, + HANDLE hDevModeParam) { - HANDLE hDevMode; + HANDLE hDevMode = hDevModeParam; LPDEVMODEW devmode; guchar *extras; GtkPaperSize *paper_size; @@ -946,31 +952,54 @@ devmode_from_settings (GtkPrintSettings *settings, gsize extras_len; const char *val; - extras = NULL; - extras_len = 0; - extras_base64 = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_EXTRA); - if (extras_base64) - extras = g_base64_decode (extras_base64, &extras_len); - - hDevMode = GlobalAlloc (GMEM_MOVEABLE, - sizeof (DEVMODEW) + extras_len); - - devmode = GlobalLock (hDevMode); - - memset (devmode, 0, sizeof (DEVMODEW)); - - devmode->dmSpecVersion = DM_SPECVERSION; - devmode->dmSize = sizeof (DEVMODEW); - - devmode->dmDriverExtra = 0; - if (extras && extras_len > 0) + /* If we already provided a valid hDevMode, don't initialize a new one; just lock the one we have */ + if (hDevMode) + { + devmode = GlobalLock (hDevMode); + } + else { - devmode->dmDriverExtra = extras_len; - memcpy (((char *)devmode) + sizeof (DEVMODEW), extras, extras_len); + const char *saved_printer_name; + gunichar2 *device_name; + extras = NULL; + extras_len = 0; + extras_base64 = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_EXTRA); + if (extras_base64) + extras = g_base64_decode (extras_base64, &extras_len); + + hDevMode = GlobalAlloc (GMEM_MOVEABLE, + sizeof (DEVMODEW) + extras_len); + + devmode = GlobalLock (hDevMode); + + memset (devmode, 0, sizeof (DEVMODEW)); + + devmode->dmSpecVersion = DM_SPECVERSION; + devmode->dmSize = sizeof (DEVMODEW); + + memset (devmode->dmDeviceName, 0, CCHDEVICENAME * sizeof (wchar_t)); + saved_printer_name = gtk_print_settings_get (settings, "win32-devmode-name"); + if (saved_printer_name) + { + device_name = g_utf8_to_utf16 (saved_printer_name, -1, NULL, NULL, NULL); + if (device_name) + wcsncpy (devmode->dmDeviceName, device_name, MIN (CCHDEVICENAME - 1, wcslen (device_name))); + g_free (device_name); + } + + devmode->dmDriverExtra = 0; + if (extras && extras_len > 0) + { + devmode->dmDriverExtra = extras_len; + memcpy (((char *)devmode) + sizeof (DEVMODEW), extras, extras_len); + } + g_free (extras); + + if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION)) + { + devmode->dmDriverVersion = gtk_print_settings_get_int (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION); + } } - g_free (extras); - if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION)) - devmode->dmDriverVersion = gtk_print_settings_get_int (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION); if (page_setup || gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_ORIENTATION)) @@ -1224,12 +1253,25 @@ dialog_from_print_settings (GtkPrintOperation *op, } } + /* If we have a printer saved, restore our settings */ printer = gtk_print_settings_get_printer (settings); if (printer) - printdlgex->hDevNames = gtk_print_win32_devnames_to_win32_from_printer_name (printer); + { + printdlgex->hDevNames = gtk_print_win32_devnames_to_win32_from_printer_name (printer); - printdlgex->hDevMode = devmode_from_settings (settings, - op->priv->default_page_setup); + printdlgex->hDevMode = devmode_from_settings (settings, + op->priv->default_page_setup, NULL); + } + else + { + /* Otherwise, use the default settings */ + DWORD FlagsCopy = printdlgex->Flags; + printdlgex->Flags |= PD_RETURNDEFAULT; + PrintDlgExW (printdlgex); + printdlgex->Flags = FlagsCopy; + + devmode_from_settings (settings, op->priv->default_page_setup, printdlgex->hDevMode); + } } typedef struct { @@ -1551,7 +1593,7 @@ gtk_print_operation_run_without_dialog (GtkPrintOperation *op, } hDevNames = gtk_print_win32_devnames_to_win32_from_printer_name (printer); - hDevMode = devmode_from_settings (settings, op->priv->default_page_setup); + hDevMode = devmode_from_settings (settings, op->priv->default_page_setup, NULL); /* Create a printer DC for the print settings and page setup provided. */ pdn = GlobalLock (hDevNames); @@ -2049,7 +2091,7 @@ gtk_print_run_page_setup_dialog (GtkWindow *parent, pagesetupdlg->hwndOwner = NULL; pagesetupdlg->Flags = PSD_DEFAULTMINMARGINS; - pagesetupdlg->hDevMode = devmode_from_settings (settings, page_setup); + pagesetupdlg->hDevMode = devmode_from_settings (settings, page_setup, NULL); pagesetupdlg->hDevNames = NULL; printer = gtk_print_settings_get_printer (settings); if (printer) |