+static void
+plug_grab_notify (GtkWidget *widget,
+ gboolean was_grabbed,
+ GtkPrintOperation *op)
+{
+ EnableWindow (GetAncestor (GDK_WINDOW_HWND (gtk_widget_get_window (widget)), GA_ROOT),
+ was_grabbed);
+}
+
+
+static BOOL CALLBACK
+pageDlgProc (HWND wnd, UINT message, WPARAM wparam, LPARAM lparam)
+{
+ GtkPrintOperation *op;
+ GtkPrintOperationWin32 *op_win32;
+
+ if (message == WM_INITDIALOG)
+ {
+ PROPSHEETPAGEW *page = (PROPSHEETPAGEW *)lparam;
+ GtkWidget *plug;
+
+ op = GTK_PRINT_OPERATION ((gpointer)page->lParam);
+ op_win32 = op->priv->platform_data;
+
+ SetWindowLongPtrW (wnd, GWLP_USERDATA, (LONG_PTR)op);
+
+ plug = _gtk_win32_embed_widget_new (wnd);
+ gtk_window_set_modal (GTK_WINDOW (plug), TRUE);
+ op_win32->embed_widget = plug;
+ gtk_container_add (GTK_CONTAINER (plug), op->priv->custom_widget);
+ gtk_widget_show (op->priv->custom_widget);
+ gtk_widget_show (plug);
+ gdk_window_focus (gtk_widget_get_window (plug), GDK_CURRENT_TIME);
+
+ /* This dialog is modal, so we grab the embed widget */
+ gtk_grab_add (plug);
+
+ /* When we lose the grab we need to disable the print dialog */
+ g_signal_connect (plug, "grab-notify", G_CALLBACK (plug_grab_notify), op);
+ return FALSE;
+ }
+ else if (message == WM_DESTROY)
+ {
+ op = GTK_PRINT_OPERATION (GetWindowLongPtrW (wnd, GWLP_USERDATA));
+ op_win32 = op->priv->platform_data;
+
+ g_signal_emit_by_name (op, "custom-widget-apply", op->priv->custom_widget);
+ gtk_widget_destroy (op_win32->embed_widget);
+ op_win32->embed_widget = NULL;
+ op->priv->custom_widget = NULL;
+ }
+ else
+ {
+ op = GTK_PRINT_OPERATION (GetWindowLongPtrW (wnd, GWLP_USERDATA));
+ op_win32 = op->priv->platform_data;
+
+ return _gtk_win32_embed_widget_dialog_procedure (GTK_WIN32_EMBED_WIDGET (op_win32->embed_widget),
+ wnd, message, wparam, lparam);
+ }
+
+ return FALSE;
+}
+
+static HPROPSHEETPAGE
+create_application_page (GtkPrintOperation *op)
+{
+ HPROPSHEETPAGE hpage;
+ PROPSHEETPAGEW page;
+ DLGTEMPLATE *template;
+ HGLOBAL htemplate;
+ LONG base_units;
+ WORD baseunitX, baseunitY;
+ WORD *array;
+ GtkRequisition requisition;
+ const char *tab_label;
+
+ /* Make the template the size of the custom widget size request */
+ gtk_widget_get_preferred_size (op->priv->custom_widget,
+ &requisition, NULL);
+
+ base_units = GetDialogBaseUnits ();
+ baseunitX = LOWORD (base_units);
+ baseunitY = HIWORD (base_units);
+
+ htemplate = GlobalAlloc (GMEM_MOVEABLE,
+ sizeof (DLGTEMPLATE) + sizeof (WORD) * 3);
+ template = GlobalLock (htemplate);
+ template->style = WS_CHILDWINDOW | DS_CONTROL;
+ template->dwExtendedStyle = WS_EX_CONTROLPARENT;
+ template->cdit = 0;
+ template->x = MulDiv (0, 4, baseunitX);
+ template->y = MulDiv (0, 8, baseunitY);
+ template->cx = MulDiv (requisition.width, 4, baseunitX);
+ template->cy = MulDiv (requisition.height, 8, baseunitY);
+
+ array = (WORD *) (template+1);
+ *array++ = 0; /* menu */
+ *array++ = 0; /* class */
+ *array++ = 0; /* title */
+
+ memset (&page, 0, sizeof (page));
+ page.dwSize = sizeof (page);
+ page.dwFlags = PSP_DLGINDIRECT | PSP_USETITLE | PSP_PREMATURE;
+ page.hInstance = GetModuleHandle (NULL);
+ page.pResource = template;
+
+ tab_label = op->priv->custom_tab_label;
+ if (tab_label == NULL)
+ tab_label = g_get_application_name ();
+ if (tab_label == NULL)
+ tab_label = _("Application");
+ page.pszTitle = g_utf8_to_utf16 (tab_label,
+ -1, NULL, NULL, NULL);
+ page.pfnDlgProc = pageDlgProc;
+ page.pfnCallback = NULL;
+ page.lParam = (LPARAM) op;
+ hpage = CreatePropertySheetPageW (&page);
+
+ GlobalUnlock (htemplate);
+
+ /* TODO: We're leaking htemplate here... */
+
+ return hpage;
+}
+
+static GtkPageSetup *
+create_page_setup (GtkPrintOperation *op)
+{
+ GtkPrintOperationPrivate *priv = op->priv;
+ GtkPageSetup *page_setup;
+ GtkPrintSettings *settings;
+
+ if (priv->default_page_setup)
+ page_setup = gtk_page_setup_copy (priv->default_page_setup);
+ else
+ page_setup = gtk_page_setup_new ();
+
+ settings = priv->print_settings;
+ if (settings)
+ {
+ GtkPaperSize *paper_size;
+
+ if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_ORIENTATION))
+ gtk_page_setup_set_orientation (page_setup,
+ gtk_print_settings_get_orientation (settings));
+
+
+ paper_size = gtk_print_settings_get_paper_size (settings);
+ if (paper_size)
+ {
+ gtk_page_setup_set_paper_size (page_setup, paper_size);
+ gtk_paper_size_free (paper_size);
+ }
+
+ /* TODO: Margins? */
+ }
+
+ return page_setup;
+}
+