+finish_print (PrintResponseData *rdata,
+ GtkPrinter *printer,
+ GtkPageSetup *page_setup,
+ GtkPrintSettings *settings,
+ gboolean page_setup_set)
+{
+ GtkPrintOperation *op = rdata->op;
+ GtkPrintOperationPrivate *priv = op->priv;
+ GtkPrintJob *job;
+ gdouble top, bottom, left, right;
+
+ if (rdata->do_print)
+ {
+ gtk_print_operation_set_print_settings (op, settings);
+ priv->print_context = _gtk_print_context_new (op);
+
+ if (gtk_print_settings_get_number_up (settings) < 2)
+ {
+ if (printer && gtk_printer_get_hard_margins (printer, &top, &bottom, &left, &right))
+ _gtk_print_context_set_hard_margins (priv->print_context, top, bottom, left, right);
+ }
+ else
+ {
+ /* Pages do not have any unprintable area when printing n-up as each page on the
+ * sheet has been scaled down and translated to a position within the printable
+ * area of the sheet.
+ */
+ _gtk_print_context_set_hard_margins (priv->print_context, 0, 0, 0, 0);
+ }
+
+ if (page_setup != NULL &&
+ (gtk_print_operation_get_default_page_setup (op) == NULL ||
+ page_setup_set))
+ gtk_print_operation_set_default_page_setup (op, page_setup);
+
+ _gtk_print_context_set_page_setup (priv->print_context, page_setup);
+
+ if (!rdata->do_preview)
+ {
+ GtkPrintOperationUnix *op_unix;
+ cairo_t *cr;
+
+ op_unix = g_new0 (GtkPrintOperationUnix, 1);
+ priv->platform_data = op_unix;
+ priv->free_platform_data = (GDestroyNotify) op_unix_free;
+ op_unix->parent = rdata->parent;
+
+ priv->start_page = unix_start_page;
+ priv->end_page = unix_end_page;
+ priv->end_run = unix_end_run;
+
+ job = gtk_print_job_new (priv->job_name, printer, settings, page_setup);
+ op_unix->job = job;
+ gtk_print_job_set_track_print_status (job, priv->track_print_status);
+
+ op_unix->surface = gtk_print_job_get_surface (job, &priv->error);
+ if (op_unix->surface == NULL)
+ {
+ rdata->result = GTK_PRINT_OPERATION_RESULT_ERROR;
+ rdata->do_print = FALSE;
+ goto out;
+ }
+
+ cr = cairo_create (op_unix->surface);
+ gtk_print_context_set_cairo_context (priv->print_context, cr, 72, 72);
+ cairo_destroy (cr);
+
+ _gtk_print_operation_set_status (op, gtk_print_job_get_status (job), NULL);
+
+ op_unix->job_status_changed_tag =
+ g_signal_connect (job, "status-changed",
+ G_CALLBACK (job_status_changed_cb), op);
+
+ priv->print_pages = gtk_print_job_get_pages (job);
+ priv->page_ranges = gtk_print_job_get_page_ranges (job, &priv->num_page_ranges);
+ priv->manual_num_copies = gtk_print_job_get_num_copies (job);
+ priv->manual_collation = gtk_print_job_get_collate (job);
+ priv->manual_reverse = gtk_print_job_get_reverse (job);
+ priv->manual_page_set = gtk_print_job_get_page_set (job);
+ priv->manual_scale = gtk_print_job_get_scale (job);
+ priv->manual_orientation = gtk_print_job_get_rotate (job);
+ priv->manual_number_up = gtk_print_job_get_n_up (job);
+ priv->manual_number_up_layout = gtk_print_job_get_n_up_layout (job);
+ }
+ }
+ out:
+ if (rdata->print_cb)
+ rdata->print_cb (op, rdata->parent, rdata->do_print, rdata->result);
+
+ if (rdata->destroy)
+ rdata->destroy (rdata);
+}
+
+static void