1 /* GTK - The GIMP Toolkit
2 * gtkprintoperation-win32.c: Print Operation Details for Win32
3 * Copyright (C) 2006, Red Hat, Inc.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the
17 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 * Boston, MA 02111-1307, USA.
22 #define _WIN32_WINNT 0x0500
23 #define WINVER _WIN32_WINNT
30 #include <cairo-win32.h>
32 #include "gtkprintoperation-private.h"
33 #include "gtkprint-win32.h"
35 #include "gtkinvisible.h"
38 #define MAX_PAGE_RANGES 20
39 #define STATUS_POLLING_TIME 2000
41 #ifndef JOB_STATUS_RESTART
42 #define JOB_STATUS_RESTART 0x800
45 #ifndef JOB_STATUS_COMPLETE
46 #define JOB_STATUS_COMPLETE 0x1000
56 } GtkPrintOperationWin32;
58 static void win32_poll_status (GtkPrintOperation *op);
60 static const GUID myIID_IPrintDialogCallback = {0x5852a2c3,0x6530,0x11d1,{0xb6,0xa3,0x0,0x0,0xf8,0x75,0x7b,0xf9}};
63 #define INTERFACE IPrintDialogCallback
64 DECLARE_INTERFACE_ (IPrintDialogCallback, IUnknown)
66 STDMETHOD (QueryInterface)(THIS_ REFIID,LPVOID*) PURE;
67 STDMETHOD_ (ULONG, AddRef)(THIS) PURE;
68 STDMETHOD_ (ULONG, Release)(THIS) PURE;
69 STDMETHOD (InitDone)(THIS) PURE;
70 STDMETHOD (SelectionChange)(THIS) PURE;
71 STDMETHOD (HandleMessage)(THIS_ HWND,UINT,WPARAM,LPARAM,LRESULT*) PURE;
74 static UINT got_gdk_events_message;
77 run_mainloop_hook (HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM lParam)
79 if (uiMsg == WM_INITDIALOG)
81 gdk_win32_set_modal_dialog_libgtk_only (hdlg);
82 while (gtk_events_pending ())
83 gtk_main_iteration ();
85 else if (uiMsg == got_gdk_events_message)
87 while (gtk_events_pending ())
88 gtk_main_iteration ();
94 static GtkPageOrientation
95 orientation_from_win32 (short orientation)
97 if (orientation == DMORIENT_LANDSCAPE)
98 return GTK_PAGE_ORIENTATION_LANDSCAPE;
99 return GTK_PAGE_ORIENTATION_PORTRAIT;
103 orientation_to_win32 (GtkPageOrientation orientation)
105 if (orientation == GTK_PAGE_ORIENTATION_LANDSCAPE ||
106 orientation == GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE)
107 return DMORIENT_LANDSCAPE;
108 return DMORIENT_PORTRAIT;
111 static GtkPaperSize *
112 paper_size_from_win32 (short size)
118 case DMPAPER_LETTER_TRANSVERSE:
120 case DMPAPER_LETTERSMALL:
123 case DMPAPER_TABLOID:
130 case DMPAPER_STATEMENT:
133 case DMPAPER_EXECUTIVE:
134 name = "na_executive";
137 case DMPAPER_A3_TRANSVERSE:
141 case DMPAPER_A4SMALL:
142 case DMPAPER_A4_TRANSVERSE:
146 case DMPAPER_A5_TRANSVERSE:
153 case DMPAPER_B5_TRANSVERSE:
169 name = "na_number-9";
172 name = "na_number-10";
175 name = "na_number-11";
178 name = "na_number-12";
181 name = "na_number-14";
207 case DMPAPER_ENV_C65:
219 case DMPAPER_ENV_ITALY:
222 case DMPAPER_ENV_MONARCH:
225 case DMPAPER_ENV_PERSONAL:
226 name = "na_personal";
228 case DMPAPER_FANFOLD_US:
229 name = "na_fanfold-us";
231 case DMPAPER_FANFOLD_STD_GERMAN:
232 name = "na_fanfold-eur";
234 case DMPAPER_FANFOLD_LGL_GERMAN:
235 name = "na_foolscap";
240 case DMPAPER_JAPANESE_POSTCARD:
249 case DMPAPER_ENV_INVITE:
252 case DMPAPER_LETTER_EXTRA:
253 case DMPAPER_LETTER_EXTRA_TRANSVERSE:
254 name = "na_letter-extra";
256 case DMPAPER_LEGAL_EXTRA:
257 name = "na_legal-extra";
259 case DMPAPER_TABLOID_EXTRA:
262 case DMPAPER_A4_EXTRA:
263 name = "iso_a4-extra";
268 case DMPAPER_LETTER_PLUS:
269 name = "na_letter-plus";
271 case DMPAPER_A3_EXTRA:
272 case DMPAPER_A3_EXTRA_TRANSVERSE:
273 name = "iso_a3-extra";
275 case DMPAPER_A5_EXTRA:
276 name = "iso_a5-extra";
278 case DMPAPER_B5_EXTRA:
279 name = "iso_b5-extra";
291 return gtk_paper_size_new (name);
297 paper_size_to_win32 (GtkPaperSize *paper_size)
301 if (gtk_paper_size_is_custom (paper_size))
304 format = gtk_paper_size_get_name (paper_size);
306 if (strcmp (format, "na_letter") == 0)
307 return DMPAPER_LETTER;
308 if (strcmp (format, "na_ledger") == 0)
309 return DMPAPER_LEDGER;
310 if (strcmp (format, "na_legal") == 0)
311 return DMPAPER_LEGAL;
312 if (strcmp (format, "na_invoice") == 0)
313 return DMPAPER_STATEMENT;
314 if (strcmp (format, "na_executive") == 0)
315 return DMPAPER_EXECUTIVE;
316 if (strcmp (format, "iso_a2") == 0)
318 if (strcmp (format, "iso_a3") == 0)
320 if (strcmp (format, "iso_a4") == 0)
322 if (strcmp (format, "iso_a5") == 0)
324 if (strcmp (format, "iso_b4") == 0)
326 if (strcmp (format, "iso_b5") == 0)
328 if (strcmp (format, "na_quarto") == 0)
329 return DMPAPER_QUARTO;
330 if (strcmp (format, "na_10x14") == 0)
331 return DMPAPER_10X14;
332 if (strcmp (format, "na_number-9") == 0)
333 return DMPAPER_ENV_9;
334 if (strcmp (format, "na_number-10") == 0)
335 return DMPAPER_ENV_10;
336 if (strcmp (format, "na_number-11") == 0)
337 return DMPAPER_ENV_11;
338 if (strcmp (format, "na_number-12") == 0)
339 return DMPAPER_ENV_12;
340 if (strcmp (format, "na_number-14") == 0)
341 return DMPAPER_ENV_14;
342 if (strcmp (format, "na_c") == 0)
343 return DMPAPER_CSHEET;
344 if (strcmp (format, "na_d") == 0)
345 return DMPAPER_DSHEET;
346 if (strcmp (format, "na_e") == 0)
347 return DMPAPER_ESHEET;
348 if (strcmp (format, "iso_dl") == 0)
349 return DMPAPER_ENV_DL;
350 if (strcmp (format, "iso_c3") == 0)
351 return DMPAPER_ENV_C3;
352 if (strcmp (format, "iso_c4") == 0)
353 return DMPAPER_ENV_C4;
354 if (strcmp (format, "iso_c5") == 0)
355 return DMPAPER_ENV_C5;
356 if (strcmp (format, "iso_c6") == 0)
357 return DMPAPER_ENV_C6;
358 if (strcmp (format, "iso_c5c6") == 0)
359 return DMPAPER_ENV_C65;
360 if (strcmp (format, "iso_b6") == 0)
361 return DMPAPER_ENV_B6;
362 if (strcmp (format, "om_italian") == 0)
363 return DMPAPER_ENV_ITALY;
364 if (strcmp (format, "na_monarch") == 0)
365 return DMPAPER_ENV_MONARCH;
366 if (strcmp (format, "na_personal") == 0)
367 return DMPAPER_ENV_PERSONAL;
368 if (strcmp (format, "na_fanfold-us") == 0)
369 return DMPAPER_FANFOLD_US;
370 if (strcmp (format, "na_fanfold-eur") == 0)
371 return DMPAPER_FANFOLD_STD_GERMAN;
372 if (strcmp (format, "na_foolscap") == 0)
373 return DMPAPER_FANFOLD_LGL_GERMAN;
374 if (strcmp (format, "jpn_hagaki") == 0)
375 return DMPAPER_JAPANESE_POSTCARD;
376 if (strcmp (format, "na_9x11") == 0)
378 if (strcmp (format, "na_10x11") == 0)
379 return DMPAPER_10X11;
380 if (strcmp (format, "om_invite") == 0)
381 return DMPAPER_ENV_INVITE;
382 if (strcmp (format, "na_letter-extra") == 0)
383 return DMPAPER_LETTER_EXTRA;
384 if (strcmp (format, "na_legal-extra") == 0)
385 return DMPAPER_LEGAL_EXTRA;
386 if (strcmp (format, "na_arch") == 0)
387 return DMPAPER_TABLOID_EXTRA;
388 if (strcmp (format, "iso_a3-extra") == 0)
389 return DMPAPER_A3_EXTRA;
390 if (strcmp (format, "iso_a4-extra") == 0)
391 return DMPAPER_A4_EXTRA;
392 if (strcmp (format, "iso_a5-extra") == 0)
393 return DMPAPER_A5_EXTRA;
394 if (strcmp (format, "iso_b5-extra") == 0)
395 return DMPAPER_B5_EXTRA;
396 if (strcmp (format, "na_b-plus") == 0)
397 return DMPAPER_B_PLUS;
398 if (strcmp (format, "na_letter-plus") == 0)
399 return DMPAPER_LETTER_PLUS;
405 win32_start_page (GtkPrintOperation *op,
406 GtkPrintContext *print_context,
407 GtkPageSetup *page_setup)
409 GtkPrintOperationWin32 *op_win32 = op->priv->platform_data;
411 GtkPaperSize *paper_size;
413 devmode = GlobalLock (op_win32->devmode);
415 devmode->dmFields |= DM_ORIENTATION;
416 devmode->dmOrientation =
417 orientation_to_win32 (gtk_page_setup_get_orientation (page_setup));
419 paper_size = gtk_page_setup_get_paper_size (page_setup);
420 devmode->dmFields |= DM_PAPERSIZE;
421 devmode->dmFields &= ~(DM_PAPERWIDTH | DM_PAPERLENGTH);
422 devmode->dmPaperSize = paper_size_to_win32 (paper_size);
423 if (devmode->dmPaperSize == 0)
425 devmode->dmPaperSize = DMPAPER_USER;
426 devmode->dmFields |= DM_PAPERWIDTH | DM_PAPERLENGTH;
427 devmode->dmPaperWidth = gtk_paper_size_get_width (paper_size, GTK_UNIT_MM) * 10.0;
428 devmode->dmPaperLength = gtk_paper_size_get_height (paper_size, GTK_UNIT_MM) * 10.0;
431 ResetDCW (op_win32->hdc, devmode);
433 GlobalUnlock (op_win32->devmode);
435 StartPage (op_win32->hdc);
439 win32_end_page (GtkPrintOperation *op,
440 GtkPrintContext *print_context)
442 GtkPrintOperationWin32 *op_win32 = op->priv->platform_data;
443 EndPage (op_win32->hdc);
447 win32_poll_status_timeout (GtkPrintOperation *op)
449 GtkPrintOperationWin32 *op_win32 = op->priv->platform_data;
451 op_win32->timeout_id = 0;
452 /* We need to ref this, as setting the status to finished
453 might unref the object */
455 win32_poll_status (op);
457 if (!gtk_print_operation_is_finished (op))
458 op_win32->timeout_id = g_timeout_add (STATUS_POLLING_TIME,
459 (GSourceFunc)win32_poll_status_timeout,
467 win32_end_run (GtkPrintOperation *op,
470 GtkPrintOperationWin32 *op_win32 = op->priv->platform_data;
472 HANDLE printerHandle = 0;
474 EndDoc (op_win32->hdc);
476 if (op->priv->track_print_status)
478 devnames = GlobalLock (op_win32->devnames);
479 if (!OpenPrinterW (((gunichar2 *)devnames) + devnames->wDeviceOffset,
480 &printerHandle, NULL))
482 GlobalUnlock (op_win32->devnames);
485 GlobalFree(op_win32->devmode);
486 GlobalFree(op_win32->devnames);
488 cairo_surface_destroy (op->priv->surface);
489 op->priv->surface = NULL;
491 DeleteDC(op_win32->hdc);
493 if (printerHandle != 0)
495 op_win32->printerHandle = printerHandle;
496 win32_poll_status (op);
497 op_win32->timeout_id = g_timeout_add (STATUS_POLLING_TIME,
498 (GSourceFunc)win32_poll_status_timeout,
502 /* Dunno what happened, pretend its finished */
503 _gtk_print_operation_set_status (op, GTK_PRINT_STATUS_FINISHED, NULL);
507 win32_poll_status (GtkPrintOperation *op)
509 GtkPrintOperationWin32 *op_win32 = op->priv->platform_data;
512 JOB_INFO_1W *job_info;
513 GtkPrintStatus status;
517 GetJobW (op_win32->printerHandle, op_win32->job_id,
518 1,(LPBYTE)NULL, 0, &needed);
519 data = g_malloc (needed);
520 ret = GetJobW (op_win32->printerHandle, op_win32->job_id,
521 1, (LPBYTE)data, needed, &needed);
526 job_info = (JOB_INFO_1W *)data;
527 DWORD win32_status = job_info->Status;
529 if (job_info->pStatus)
530 status_str = g_utf16_to_utf8 (job_info->pStatus,
531 -1, NULL, NULL, NULL);
534 (JOB_STATUS_COMPLETE | JOB_STATUS_PRINTED))
535 status = GTK_PRINT_STATUS_FINISHED;
536 else if (win32_status &
537 (JOB_STATUS_OFFLINE |
538 JOB_STATUS_PAPEROUT |
540 JOB_STATUS_USER_INTERVENTION))
542 status = GTK_PRINT_STATUS_PENDING_ISSUE;
543 if (status_str == NULL)
545 if (win32_status & JOB_STATUS_OFFLINE)
546 status_str = g_strdup (_("Printer offline"));
547 else if (win32_status & JOB_STATUS_PAPEROUT)
548 status_str = g_strdup (_("Out of paper"));
549 else if (win32_status & JOB_STATUS_PAUSED)
550 status_str = g_strdup (_("Paused"));
551 else if (win32_status & JOB_STATUS_USER_INTERVENTION)
552 status_str = g_strdup (_("Need user intervention"));
555 else if (win32_status &
556 (JOB_STATUS_BLOCKED_DEVQ |
559 status = GTK_PRINT_STATUS_FINISHED_ABORTED;
560 else if (win32_status &
561 (JOB_STATUS_SPOOLING |
562 JOB_STATUS_DELETING))
563 status = GTK_PRINT_STATUS_PENDING;
564 else if (win32_status & JOB_STATUS_PRINTING)
565 status = GTK_PRINT_STATUS_PRINTING;
567 status = GTK_PRINT_STATUS_FINISHED;
570 status = GTK_PRINT_STATUS_FINISHED;
574 _gtk_print_operation_set_status (op, status, status_str);
580 op_win32_free (GtkPrintOperationWin32 *op_win32)
582 if (op_win32->printerHandle)
583 ClosePrinter (op_win32->printerHandle);
584 if (op_win32->timeout_id != 0)
585 g_source_remove (op_win32->timeout_id);
590 get_parent_hwnd (GtkWidget *widget)
592 gtk_widget_realize (widget);
593 return gdk_win32_drawable_get_handle (widget->window);
598 devnames_to_settings (GtkPrintSettings *settings,
601 GtkPrintWin32Devnames *devnames = gtk_print_win32_devnames_from_win32 (hDevNames);
602 gtk_print_settings_set_printer (settings, devnames->device);
603 gtk_print_win32_devnames_free (devnames);
607 devmode_to_settings (GtkPrintSettings *settings,
612 devmode = GlobalLock (hDevMode);
614 gtk_print_settings_set_int (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION,
615 devmode->dmDriverVersion);
616 if (devmode->dmDriverExtra != 0)
618 char *extra = g_base64_encode (((char *)devmode) + sizeof (DEVMODEW),
619 devmode->dmDriverExtra);
620 gtk_print_settings_set (settings,
621 GTK_PRINT_SETTINGS_WIN32_DRIVER_EXTRA,
626 if (devmode->dmFields & DM_ORIENTATION)
627 gtk_print_settings_set_orientation (settings,
628 orientation_from_win32 (devmode->dmOrientation));
631 if (devmode->dmFields & DM_PAPERSIZE &&
632 devmode->dmPaperSize != 0)
634 GtkPaperSize *paper_size = paper_size_from_win32 (devmode->dmPaperSize);
637 gtk_print_settings_set_paper_size (settings, paper_size);
638 gtk_paper_size_free (paper_size);
640 gtk_print_settings_set_int (settings, "win32-paper-size", (int)devmode->dmPaperSize);
642 else if ((devmode->dmFields & DM_PAPERSIZE &&
643 devmode->dmPaperSize == 0) ||
644 ((devmode->dmFields & DM_PAPERWIDTH) &&
645 (devmode->dmFields & DM_PAPERLENGTH)))
647 GtkPaperSize *paper_size;
648 char *form_name = NULL;
649 if (devmode->dmFields & DM_FORMNAME)
650 form_name = g_utf16_to_utf8 (devmode->dmFormName,
651 -1, NULL, NULL, NULL);
652 if (form_name == NULL || form_name[0] == 0)
653 form_name = g_strdup (_("Custom size"));
654 paper_size = gtk_paper_size_new_custom (form_name,
656 devmode->dmPaperWidth * 10.0,
657 devmode->dmPaperLength * 10.0,
659 gtk_print_settings_set_paper_size (settings, paper_size);
660 gtk_paper_size_free (paper_size);
663 if (devmode->dmFields & DM_SCALE)
664 gtk_print_settings_set_scale (settings,
665 devmode->dmScale / 100.0);
667 if (devmode->dmFields & DM_COPIES)
668 gtk_print_settings_set_n_copies (settings,
671 if (devmode->dmFields & DM_DEFAULTSOURCE)
674 switch (devmode->dmDefaultSource)
686 case DMBIN_ENVMANUAL:
687 source = "envelope-manual";
701 case DMBIN_FORMSOURCE:
702 source = "form-source";
704 case DMBIN_LARGECAPACITY:
705 source = "large-capacity";
708 source = "large-format";
714 source = "small-format";
717 gtk_print_settings_set_default_source (settings, source);
718 gtk_print_settings_set_int (settings, "win32-default-source", devmode->dmDefaultSource);
721 if (devmode->dmFields & DM_PRINTQUALITY)
723 GtkPrintQuality quality;
724 switch (devmode->dmPrintQuality)
727 quality = GTK_PRINT_QUALITY_LOW;
730 quality = GTK_PRINT_QUALITY_NORMAL;
734 quality = GTK_PRINT_QUALITY_HIGH;
737 quality = GTK_PRINT_QUALITY_DRAFT;
740 gtk_print_settings_set_quality (settings, quality);
741 gtk_print_settings_set_int (settings, "win32-print-quality", devmode->dmPrintQuality);
744 if (devmode->dmFields & DM_COLOR)
745 gtk_print_settings_set_use_color (settings, devmode->dmFields == DMCOLOR_COLOR);
747 if (devmode->dmFields & DM_DUPLEX)
749 GtkPrintDuplex duplex;
750 switch (devmode->dmDuplex)
754 duplex = GTK_PRINT_DUPLEX_SIMPLEX;
756 case DMDUP_HORIZONTAL:
757 duplex = GTK_PRINT_DUPLEX_HORIZONTAL;
760 duplex = GTK_PRINT_DUPLEX_VERTICAL;
764 gtk_print_settings_set_duplex (settings, duplex);
767 if (devmode->dmFields & DM_COLLATE)
768 gtk_print_settings_set_collate (settings,
769 devmode->dmCollate == DMCOLLATE_TRUE);
771 if (devmode->dmFields & DM_MEDIATYPE)
774 switch (devmode->dmMediaType)
777 case DMMEDIA_STANDARD:
778 media_type = "stationery";
780 case DMMEDIA_TRANSPARENCY:
781 media_type = "transparency";
784 media_type = "photographic-glossy";
787 gtk_print_settings_set_media_type (settings, media_type);
788 gtk_print_settings_set_int (settings, "win32-media-type", devmode->dmMediaType);
791 if (devmode->dmFields & DM_DITHERTYPE)
794 switch (devmode->dmDitherType)
803 case DMDITHER_COARSE:
806 case DMDITHER_LINEART:
809 case DMDITHER_GRAYSCALE:
810 dither = "grayscale";
812 case DMDITHER_ERRORDIFFUSION:
813 dither = "error-diffusion";
816 gtk_print_settings_set_dither (settings, dither);
817 gtk_print_settings_set_int (settings, "win32-dither-type", devmode->dmDitherType);
820 GlobalUnlock (hDevMode);
824 dialog_to_print_settings (GtkPrintOperation *op,
825 LPPRINTDLGEXW printdlgex)
828 GtkPrintSettings *settings;
830 settings = gtk_print_settings_new ();
832 gtk_print_settings_set_print_pages (settings,
833 GTK_PRINT_PAGES_ALL);
834 if (printdlgex->Flags & PD_CURRENTPAGE)
835 gtk_print_settings_set_print_pages (settings,
836 GTK_PRINT_PAGES_CURRENT);
837 else if (printdlgex->Flags & PD_PAGENUMS)
838 gtk_print_settings_set_print_pages (settings,
839 GTK_PRINT_PAGES_RANGES);
841 if (printdlgex->nPageRanges > 0)
843 GtkPageRange *ranges;
844 ranges = g_new (GtkPageRange, printdlgex->nPageRanges);
846 for (i = 0; i < printdlgex->nPageRanges; i++)
848 ranges[i].start = printdlgex->lpPageRanges[i].nFromPage - 1;
849 ranges[i].end = printdlgex->lpPageRanges[i].nToPage - 1;
852 gtk_print_settings_set_page_ranges (settings, ranges,
853 printdlgex->nPageRanges);
857 if (printdlgex->hDevNames != NULL)
858 devnames_to_settings (settings, printdlgex->hDevNames);
860 if (printdlgex->hDevMode != NULL)
861 devmode_to_settings (settings, printdlgex->hDevMode);
863 gtk_print_operation_set_print_settings (op, settings);
867 devmode_from_settings (GtkPrintSettings *settings,
868 GtkPageSetup *page_setup)
873 GtkPaperSize *paper_size;
874 const char *extras_base64;
880 extras_base64 = gtk_print_settings_get (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_EXTRA);
882 extras = g_base64_decode (extras_base64, &extras_len);
884 hDevMode = GlobalAlloc (GMEM_MOVEABLE,
885 sizeof (DEVMODEW) + extras_len);
887 devmode = GlobalLock (hDevMode);
889 memset (devmode, 0, sizeof (DEVMODEW));
891 devmode->dmSpecVersion = DM_SPECVERSION;
892 devmode->dmSize = sizeof (DEVMODEW);
894 devmode->dmDriverExtra = 0;
895 if (extras && extras_len > 0)
897 devmode->dmDriverExtra = extras_len;
898 memcpy (((char *)devmode) + sizeof (DEVMODEW), extras, extras_len);
901 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION))
902 devmode->dmDriverVersion = gtk_print_settings_get_int (settings, GTK_PRINT_SETTINGS_WIN32_DRIVER_VERSION);
905 gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_ORIENTATION))
907 GtkPageOrientation orientation = gtk_print_settings_get_orientation (settings);
909 orientation = gtk_page_setup_get_orientation (page_setup);
910 devmode->dmFields |= DM_ORIENTATION;
911 devmode->dmOrientation = orientation_to_win32 (orientation);
915 paper_size = gtk_paper_size_copy (gtk_page_setup_get_paper_size (page_setup));
919 if (gtk_print_settings_has_key (settings, "win32-paper-size") &&
920 (size = gtk_print_settings_get_int (settings, "win32-paper-size")) != 0)
922 devmode->dmFields |= DM_PAPERSIZE;
923 devmode->dmPaperSize = size;
927 paper_size = gtk_print_settings_get_paper_size (settings);
931 devmode->dmFields |= DM_PAPERSIZE;
932 devmode->dmPaperSize = paper_size_to_win32 (paper_size);
933 if (devmode->dmPaperSize == 0)
935 devmode->dmPaperSize = DMPAPER_USER;
936 devmode->dmFields |= DM_PAPERWIDTH | DM_PAPERLENGTH;
937 devmode->dmPaperWidth = gtk_paper_size_get_width (paper_size, GTK_UNIT_MM) / 10.0;
938 devmode->dmPaperLength = gtk_paper_size_get_height (paper_size, GTK_UNIT_MM) / 10.0;
940 gtk_paper_size_free (paper_size);
943 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_SCALE))
945 devmode->dmFields |= DM_SCALE;
946 devmode->dmScale = gtk_print_settings_get_scale (settings) * 100;
949 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_N_COPIES))
951 devmode->dmFields |= DM_COPIES;
952 devmode->dmCopies = gtk_print_settings_get_n_copies (settings);
955 if (gtk_print_settings_has_key (settings, "win32-default-source"))
957 devmode->dmFields |= DM_DEFAULTSOURCE;
958 devmode->dmDefaultSource = gtk_print_settings_get_int (settings, "win32-default-source");
960 else if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_DEFAULT_SOURCE))
962 devmode->dmFields |= DM_DEFAULTSOURCE;
963 devmode->dmDefaultSource = DMBIN_AUTO;
965 val = gtk_print_settings_get_default_source (settings);
966 if (strcmp (val, "auto") == 0)
967 devmode->dmDefaultSource = DMBIN_AUTO;
968 if (strcmp (val, "cassette") == 0)
969 devmode->dmDefaultSource = DMBIN_CASSETTE;
970 if (strcmp (val, "envelope") == 0)
971 devmode->dmDefaultSource = DMBIN_ENVELOPE;
972 if (strcmp (val, "envelope-manual") == 0)
973 devmode->dmDefaultSource = DMBIN_ENVMANUAL;
974 if (strcmp (val, "lower") == 0)
975 devmode->dmDefaultSource = DMBIN_LOWER;
976 if (strcmp (val, "manual") == 0)
977 devmode->dmDefaultSource = DMBIN_MANUAL;
978 if (strcmp (val, "middle") == 0)
979 devmode->dmDefaultSource = DMBIN_MIDDLE;
980 if (strcmp (val, "only-one") == 0)
981 devmode->dmDefaultSource = DMBIN_ONLYONE;
982 if (strcmp (val, "form-source") == 0)
983 devmode->dmDefaultSource = DMBIN_FORMSOURCE;
984 if (strcmp (val, "large-capacity") == 0)
985 devmode->dmDefaultSource = DMBIN_LARGECAPACITY;
986 if (strcmp (val, "large-format") == 0)
987 devmode->dmDefaultSource = DMBIN_LARGEFMT;
988 if (strcmp (val, "tractor") == 0)
989 devmode->dmDefaultSource = DMBIN_TRACTOR;
990 if (strcmp (val, "small-format") == 0)
991 devmode->dmDefaultSource = DMBIN_SMALLFMT;
994 if (gtk_print_settings_has_key (settings, "win32-print-quality"))
996 devmode->dmFields |= DM_PRINTQUALITY;
997 devmode->dmPrintQuality = gtk_print_settings_get_int (settings, "win32-print-quality");
999 else if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_RESOLUTION))
1001 devmode->dmFields |= DM_PRINTQUALITY;
1002 devmode->dmPrintQuality = gtk_print_settings_get_resolution (settings);
1004 else if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_QUALITY))
1006 devmode->dmFields |= DM_PRINTQUALITY;
1007 switch (gtk_print_settings_get_quality (settings))
1009 case GTK_PRINT_QUALITY_LOW:
1010 devmode->dmPrintQuality = DMRES_LOW;
1012 case GTK_PRINT_QUALITY_DRAFT:
1013 devmode->dmPrintQuality = DMRES_DRAFT;
1016 case GTK_PRINT_QUALITY_NORMAL:
1017 devmode->dmPrintQuality = DMRES_MEDIUM;
1019 case GTK_PRINT_QUALITY_HIGH:
1020 devmode->dmPrintQuality = DMRES_HIGH;
1025 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_USE_COLOR))
1027 devmode->dmFields |= DM_COLOR;
1028 if (gtk_print_settings_get_use_color (settings))
1029 devmode->dmColor = DMCOLOR_COLOR;
1031 devmode->dmColor = DMCOLOR_MONOCHROME;
1034 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_DUPLEX))
1036 devmode->dmFields |= DM_DUPLEX;
1037 switch (gtk_print_settings_get_duplex (settings))
1040 case GTK_PRINT_DUPLEX_SIMPLEX:
1041 devmode->dmDuplex = DMDUP_SIMPLEX;
1043 case GTK_PRINT_DUPLEX_HORIZONTAL:
1044 devmode->dmDuplex = DMDUP_HORIZONTAL;
1046 case GTK_PRINT_DUPLEX_VERTICAL:
1047 devmode->dmDuplex = DMDUP_VERTICAL;
1052 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_COLLATE))
1054 devmode->dmFields |= DM_COLLATE;
1055 if (gtk_print_settings_get_collate (settings))
1056 devmode->dmCollate = DMCOLLATE_TRUE;
1058 devmode->dmCollate = DMCOLLATE_FALSE;
1061 if (gtk_print_settings_has_key (settings, "win32-media-type"))
1063 devmode->dmFields |= DM_MEDIATYPE;
1064 devmode->dmMediaType = gtk_print_settings_get_int (settings, "win32-media-type");
1066 else if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_MEDIA_TYPE))
1068 devmode->dmFields |= DM_MEDIATYPE;
1069 devmode->dmMediaType = DMMEDIA_STANDARD;
1071 val = gtk_print_settings_get_media_type (settings);
1072 if (strcmp (val, "transparency") == 0)
1073 devmode->dmMediaType = DMMEDIA_TRANSPARENCY;
1074 if (strcmp (val, "photographic-glossy") == 0)
1075 devmode->dmMediaType = DMMEDIA_GLOSSY;
1078 if (gtk_print_settings_has_key (settings, "win32-dither-type"))
1080 devmode->dmFields |= DM_DITHERTYPE;
1081 devmode->dmDitherType = gtk_print_settings_get_int (settings, "win32-dither-type");
1083 else if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_DITHER))
1085 devmode->dmFields |= DM_DITHERTYPE;
1086 devmode->dmDitherType = DMDITHER_FINE;
1088 val = gtk_print_settings_get_dither (settings);
1089 if (strcmp (val, "none") == 0)
1090 devmode->dmDitherType = DMDITHER_NONE;
1091 if (strcmp (val, "coarse") == 0)
1092 devmode->dmDitherType = DMDITHER_COARSE;
1093 if (strcmp (val, "fine") == 0)
1094 devmode->dmDitherType = DMDITHER_FINE;
1095 if (strcmp (val, "lineart") == 0)
1096 devmode->dmDitherType = DMDITHER_LINEART;
1097 if (strcmp (val, "grayscale") == 0)
1098 devmode->dmDitherType = DMDITHER_GRAYSCALE;
1099 if (strcmp (val, "error-diffusion") == 0)
1100 devmode->dmDitherType = DMDITHER_ERRORDIFFUSION;
1103 GlobalUnlock (hDevMode);
1109 dialog_from_print_settings (GtkPrintOperation *op,
1110 LPPRINTDLGEXW printdlgex)
1112 GtkPrintSettings *settings = op->priv->print_settings;
1113 const char *printer;
1115 if (settings == NULL)
1118 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_PRINT_PAGES))
1120 GtkPrintPages print_pages = gtk_print_settings_get_print_pages (settings);
1122 switch (print_pages)
1125 case GTK_PRINT_PAGES_ALL:
1126 printdlgex->Flags |= PD_ALLPAGES;
1128 case GTK_PRINT_PAGES_CURRENT:
1129 printdlgex->Flags |= PD_CURRENTPAGE;
1131 case GTK_PRINT_PAGES_RANGES:
1132 printdlgex->Flags |= PD_PAGENUMS;
1136 if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_PAGE_RANGES))
1138 GtkPageRange *ranges;
1141 ranges = gtk_print_settings_get_page_ranges (settings, &num_ranges);
1143 if (num_ranges > MAX_PAGE_RANGES)
1144 num_ranges = MAX_PAGE_RANGES;
1146 printdlgex->nPageRanges = num_ranges;
1147 for (i = 0; i < num_ranges; i++)
1149 printdlgex->lpPageRanges[i].nFromPage = ranges[i].start + 1;
1150 printdlgex->lpPageRanges[i].nToPage = ranges[i].end + 1;
1154 printer = gtk_print_settings_get_printer (settings);
1156 printdlgex->hDevNames = gtk_print_win32_devnames_from_printer_name (printer);
1158 printdlgex->hDevMode = devmode_from_settings (settings,
1159 op->priv->default_page_setup);
1163 IPrintDialogCallback iPrintDialogCallback;
1166 } PrintDialogCallback;
1169 static ULONG STDMETHODCALLTYPE
1170 iprintdialogcallback_addref (IPrintDialogCallback *This)
1172 PrintDialogCallback *callback = (PrintDialogCallback *)This;
1173 return ++callback->ref_count;
1176 static ULONG STDMETHODCALLTYPE
1177 iprintdialogcallback_release (IPrintDialogCallback *This)
1179 PrintDialogCallback *callback = (PrintDialogCallback *)This;
1180 int ref_count = --callback->ref_count;
1188 static HRESULT STDMETHODCALLTYPE
1189 iprintdialogcallback_queryinterface (IPrintDialogCallback *This,
1193 if (IsEqualIID (riid, &IID_IUnknown) ||
1194 IsEqualIID (riid, &myIID_IPrintDialogCallback))
1197 IUnknown_AddRef ((IUnknown *)This);
1203 return E_NOINTERFACE;
1207 static HRESULT STDMETHODCALLTYPE
1208 iprintdialogcallback_initdone (IPrintDialogCallback *This)
1213 static HRESULT STDMETHODCALLTYPE
1214 iprintdialogcallback_selectionchange (IPrintDialogCallback *This)
1219 static HRESULT STDMETHODCALLTYPE
1220 iprintdialogcallback_handlemessage (IPrintDialogCallback *This,
1227 PrintDialogCallback *callback = (PrintDialogCallback *)This;
1229 if (!callback->set_hwnd)
1231 gdk_win32_set_modal_dialog_libgtk_only (hDlg);
1232 callback->set_hwnd = TRUE;
1233 while (gtk_events_pending ())
1234 gtk_main_iteration ();
1236 else if (uMsg == got_gdk_events_message)
1238 while (gtk_events_pending ())
1239 gtk_main_iteration ();
1248 static IPrintDialogCallbackVtbl ipdc_vtbl = {
1249 iprintdialogcallback_queryinterface,
1250 iprintdialogcallback_addref,
1251 iprintdialogcallback_release,
1252 iprintdialogcallback_initdone,
1253 iprintdialogcallback_selectionchange,
1254 iprintdialogcallback_handlemessage
1257 static IPrintDialogCallback *
1258 print_callback_new (void)
1260 PrintDialogCallback *callback;
1262 callback = g_new0 (PrintDialogCallback, 1);
1263 callback->iPrintDialogCallback.lpVtbl = &ipdc_vtbl;
1264 callback->ref_count = 1;
1265 callback->set_hwnd = FALSE;
1267 return &callback->iPrintDialogCallback;
1270 GtkPrintOperationResult
1271 _gtk_print_operation_platform_backend_run_dialog (GtkPrintOperation *op,
1277 LPPRINTDLGEXW printdlgex = NULL;
1278 LPPRINTPAGERANGE page_ranges = NULL;
1280 GtkWidget *invisible = NULL;
1281 GtkPrintOperationResult result;
1282 GtkPrintOperationWin32 *op_win32;
1283 IPrintDialogCallback *callback;
1289 invisible = gtk_invisible_new ();
1290 parentHWnd = get_parent_hwnd (invisible);
1293 parentHWnd = get_parent_hwnd (GTK_WIDGET (parent));
1295 printdlgex = (LPPRINTDLGEXW)GlobalAlloc (GPTR, sizeof (PRINTDLGEXW));
1298 result = GTK_PRINT_OPERATION_RESULT_ERROR;
1301 GTK_PRINT_ERROR_NOMEM,
1302 _("Not enough free memory"));
1306 printdlgex->lStructSize = sizeof(PRINTDLGEXW);
1307 printdlgex->hwndOwner = parentHWnd;
1308 printdlgex->hDevMode = NULL;
1309 printdlgex->hDevNames = NULL;
1310 printdlgex->hDC = NULL;
1311 printdlgex->Flags = PD_RETURNDC | PD_NOSELECTION;
1312 if (op->priv->current_page == -1)
1313 printdlgex->Flags |= PD_NOCURRENTPAGE;
1314 printdlgex->Flags2 = 0;
1315 printdlgex->ExclusionFlags = 0;
1317 page_ranges = (LPPRINTPAGERANGE) GlobalAlloc (GPTR,
1318 MAX_PAGE_RANGES * sizeof (PRINTPAGERANGE));
1321 result = GTK_PRINT_OPERATION_RESULT_ERROR;
1324 GTK_PRINT_ERROR_NOMEM,
1325 _("Not enough free memory"));
1329 printdlgex->nPageRanges = 0;
1330 printdlgex->nMaxPageRanges = MAX_PAGE_RANGES;
1331 printdlgex->lpPageRanges = page_ranges;
1332 printdlgex->nMinPage = 1;
1333 if (op->priv->nr_of_pages != -1)
1334 printdlgex->nMaxPage = op->priv->nr_of_pages;
1336 printdlgex->nMaxPage = 10000;
1337 printdlgex->nCopies = 1;
1338 printdlgex->hInstance = 0;
1339 printdlgex->lpPrintTemplateName = NULL;
1340 printdlgex->lpCallback = NULL;
1341 printdlgex->nPropertyPages = 0;
1342 printdlgex->lphPropertyPages = NULL;
1343 printdlgex->nStartPage = START_PAGE_GENERAL;
1344 printdlgex->dwResultAction = 0;
1346 dialog_from_print_settings (op, printdlgex);
1348 callback = print_callback_new ();
1349 printdlgex->lpCallback = (IUnknown *)callback;
1350 got_gdk_events_message = RegisterWindowMessage ("GDK_WIN32_GOT_EVENTS");
1352 hResult = PrintDlgExW(printdlgex);
1353 IUnknown_Release ((IUnknown *)callback);
1354 gdk_win32_set_modal_dialog_libgtk_only (NULL);
1356 if (hResult != S_OK)
1358 result = GTK_PRINT_OPERATION_RESULT_ERROR;
1359 if (hResult == E_OUTOFMEMORY)
1362 GTK_PRINT_ERROR_NOMEM,
1363 _("Not enough free memory"));
1364 else if (hResult == E_INVALIDARG)
1367 GTK_PRINT_ERROR_INTERNAL_ERROR,
1368 _("Invalid argument to PrintDlgEx"));
1369 else if (hResult == E_POINTER)
1372 GTK_PRINT_ERROR_INTERNAL_ERROR,
1373 _("Invalid pointer to PrintDlgEx"));
1374 else if (hResult == E_HANDLE)
1377 GTK_PRINT_ERROR_INTERNAL_ERROR,
1378 _("Invalid handle to PrintDlgEx"));
1382 GTK_PRINT_ERROR_GENERAL,
1383 _("Unspecified error"));
1387 if (printdlgex->dwResultAction == PD_RESULT_PRINT ||
1388 printdlgex->dwResultAction == PD_RESULT_APPLY)
1390 result = GTK_PRINT_OPERATION_RESULT_APPLY;
1391 dialog_to_print_settings (op, printdlgex);
1394 result = GTK_PRINT_OPERATION_RESULT_CANCEL;
1396 if (printdlgex->dwResultAction == PD_RESULT_PRINT)
1403 op->priv->surface = cairo_win32_surface_create (printdlgex->hDC);
1404 op->priv->dpi_x = (double)GetDeviceCaps (printdlgex->hDC, LOGPIXELSX);
1405 op->priv->dpi_y = (double)GetDeviceCaps (printdlgex->hDC, LOGPIXELSY);
1407 memset( &docinfo, 0, sizeof (DOCINFOW));
1408 docinfo.cbSize = sizeof (DOCINFOW);
1409 docinfo.lpszDocName = g_utf8_to_utf16 (op->priv->job_name, -1, NULL, NULL, NULL);
1410 docinfo.lpszOutput = (LPCWSTR) NULL;
1411 docinfo.lpszDatatype = (LPCWSTR) NULL;
1414 job_id = StartDocW(printdlgex->hDC, &docinfo);
1415 g_free ((void *)docinfo.lpszDocName);
1418 result = GTK_PRINT_OPERATION_RESULT_ERROR;
1421 GTK_PRINT_ERROR_GENERAL,
1422 _("Error from StartDoc"));
1424 cairo_surface_destroy (op->priv->surface);
1425 op->priv->surface = NULL;
1429 op_win32 = g_new (GtkPrintOperationWin32, 1);
1430 op->priv->platform_data = op_win32;
1431 op->priv->free_platform_data = (GDestroyNotify) op_win32_free;
1432 op_win32->hdc = printdlgex->hDC;
1433 op_win32->devmode = printdlgex->hDevMode;
1434 op_win32->devnames = printdlgex->hDevNames;
1435 op_win32->job_id = job_id;
1437 op->priv->print_pages = gtk_print_settings_get_print_pages (op->priv->print_settings);
1438 op->priv->num_page_ranges = 0;
1439 if (op->priv->print_pages == GTK_PRINT_PAGES_RANGES)
1440 op->priv->page_ranges = gtk_print_settings_get_page_ranges (op->priv->print_settings,
1441 &op->priv->num_page_ranges);
1442 op->priv->manual_num_copies = printdlgex->nCopies;
1443 op->priv->manual_collation = (printdlgex->Flags & PD_COLLATE) != 0;
1444 op->priv->manual_reverse = FALSE;
1445 op->priv->manual_orientation = FALSE;
1446 op->priv->manual_scale = 1.0;
1447 op->priv->manual_page_set = GTK_PAGE_SET_ALL;
1450 op->priv->start_page = win32_start_page;
1451 op->priv->end_page = win32_end_page;
1452 op->priv->end_run = win32_end_run;
1455 if (!*do_print && printdlgex && printdlgex->hDevMode != NULL)
1456 GlobalFree(printdlgex->hDevMode);
1458 if (!*do_print && printdlgex && printdlgex->hDevNames != NULL)
1459 GlobalFree(printdlgex->hDevNames);
1462 GlobalFree (page_ranges);
1465 GlobalFree (printdlgex);
1468 gtk_widget_destroy (invisible);
1474 _gtk_print_operation_platform_backend_run_dialog_async (GtkPrintOperation *op,
1476 GtkPrintOperationPrintFunc print_cb)
1480 _gtk_print_operation_platform_backend_run_dialog (op, parent, &do_print, NULL);
1482 print_cb (op, FALSE);
1484 _gtk_print_operation_set_status (op, GTK_PRINT_STATUS_FINISHED_ABORTED, NULL);
1488 gtk_print_run_page_setup_dialog (GtkWindow *parent,
1489 GtkPageSetup *page_setup,
1490 GtkPrintSettings *settings)
1492 LPPAGESETUPDLGW pagesetupdlg = NULL;
1494 gboolean free_settings;
1495 const char *printer;
1496 GtkPaperSize *paper_size;
1497 DWORD measure_system;
1501 pagesetupdlg = (LPPAGESETUPDLGW)GlobalAlloc (GPTR, sizeof (PAGESETUPDLGW));
1505 free_settings = FALSE;
1506 if (settings == NULL)
1508 settings = gtk_print_settings_new ();
1509 free_settings = TRUE;
1512 memset (pagesetupdlg, 0, sizeof (PAGESETUPDLGW));
1514 pagesetupdlg->lStructSize = sizeof(PAGESETUPDLGW);
1517 pagesetupdlg->hwndOwner = get_parent_hwnd (GTK_WIDGET (parent));
1519 pagesetupdlg->hwndOwner = NULL;
1521 pagesetupdlg->Flags = PSD_DEFAULTMINMARGINS;
1522 pagesetupdlg->hDevMode = devmode_from_settings (settings, page_setup);
1523 pagesetupdlg->hDevNames = NULL;
1524 printer = gtk_print_settings_get_printer (settings);
1526 pagesetupdlg->hDevNames = gtk_print_win32_devnames_from_printer_name (printer);
1528 GetLocaleInfoW(LOCALE_USER_DEFAULT, LOCALE_IMEASURE|LOCALE_RETURN_NUMBER,
1529 (LPWSTR)&measure_system, sizeof (DWORD));
1531 if (measure_system == 0)
1533 pagesetupdlg->Flags |= PSD_INHUNDREDTHSOFMILLIMETERS;
1539 pagesetupdlg->Flags |= PSD_INTHOUSANDTHSOFINCHES;
1540 unit = GTK_UNIT_INCH;
1544 /* This is the object we return, we allocate it here so that
1545 * we can use the default page margins */
1547 page_setup = gtk_page_setup_copy (page_setup);
1549 page_setup = gtk_page_setup_new ();
1551 pagesetupdlg->Flags |= PSD_MARGINS;
1552 pagesetupdlg->rtMargin.left =
1553 floor (gtk_page_setup_get_left_margin (page_setup, unit) * scale + 0.5);
1554 pagesetupdlg->rtMargin.right =
1555 floor (gtk_page_setup_get_right_margin (page_setup, unit) * scale + 0.5);
1556 pagesetupdlg->rtMargin.top =
1557 floor (gtk_page_setup_get_top_margin (page_setup, unit) * scale + 0.5);
1558 pagesetupdlg->rtMargin.bottom =
1559 floor (gtk_page_setup_get_bottom_margin (page_setup, unit) * scale + 0.5);
1561 pagesetupdlg->Flags |= PSD_ENABLEPAGESETUPHOOK;
1562 pagesetupdlg->lpfnPageSetupHook = run_mainloop_hook;
1563 got_gdk_events_message = RegisterWindowMessage ("GDK_WIN32_GOT_EVENTS");
1565 res = PageSetupDlgW (pagesetupdlg);
1566 gdk_win32_set_modal_dialog_libgtk_only (NULL);
1570 if (pagesetupdlg->hDevNames != NULL)
1571 devnames_to_settings (settings, pagesetupdlg->hDevNames);
1573 if (pagesetupdlg->hDevMode != NULL)
1574 devmode_to_settings (settings, pagesetupdlg->hDevMode);
1578 g_object_unref (settings);
1582 gtk_page_setup_set_orientation (page_setup,
1583 gtk_print_settings_get_orientation (settings));
1584 paper_size = gtk_print_settings_get_paper_size (settings);
1587 gtk_page_setup_set_paper_size (page_setup, paper_size);
1588 gtk_paper_size_free (paper_size);
1591 if (pagesetupdlg->Flags & PSD_INHUNDREDTHSOFMILLIMETERS)
1598 unit = GTK_UNIT_INCH;
1602 gtk_page_setup_set_left_margin (page_setup,
1603 pagesetupdlg->rtMargin.left / scale,
1605 gtk_page_setup_set_right_margin (page_setup,
1606 pagesetupdlg->rtMargin.right / scale,
1608 gtk_page_setup_set_top_margin (page_setup,
1609 pagesetupdlg->rtMargin.top / scale,
1611 gtk_page_setup_set_bottom_margin (page_setup,
1612 pagesetupdlg->rtMargin.bottom / scale,
1620 gtk_print_run_page_setup_dialog_async (GtkWindow *parent,
1621 GtkPageSetup *page_setup,
1622 GtkPrintSettings *settings,
1623 GtkPageSetupDoneFunc done_cb,
1626 GtkPageSetup *new_page_setup;
1628 new_page_setup = gtk_print_run_page_setup_dialog (parent, page_setup, settings);
1629 done_cb (new_page_setup, data);
1630 g_object_unref (new_page_setup);