Blame gtk/gtkprintoperation.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * gtkprintoperation.c: Print Operation
Packit Service fb6fa5
 * Copyright (C) 2006, Red Hat, Inc.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include <errno.h>
Packit Service fb6fa5
#include <stdlib.h>       
Packit Service fb6fa5
#include <math.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#include "gtkprintoperation-private.h"
Packit Service fb6fa5
#include "gtkmarshalers.h"
Packit Service fb6fa5
#include <cairo-pdf.h>
Packit Service fb6fa5
#include "gtkintl.h"
Packit Service fb6fa5
#include "gtkprivate.h"
Packit Service fb6fa5
#include "gtkmessagedialog.h"
Packit Service fb6fa5
#include "gtkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
#define SHOW_PROGRESS_TIME 1200
Packit Service fb6fa5
Packit Service fb6fa5
#define GTK_PRINT_OPERATION_GET_PRIVATE(obj)(G_TYPE_INSTANCE_GET_PRIVATE ((obj), GTK_TYPE_PRINT_OPERATION, GtkPrintOperationPrivate))
Packit Service fb6fa5
Packit Service fb6fa5
enum 
Packit Service fb6fa5
{
Packit Service fb6fa5
  DONE,
Packit Service fb6fa5
  BEGIN_PRINT,
Packit Service fb6fa5
  PAGINATE,
Packit Service fb6fa5
  REQUEST_PAGE_SETUP,
Packit Service fb6fa5
  DRAW_PAGE,
Packit Service fb6fa5
  END_PRINT,
Packit Service fb6fa5
  STATUS_CHANGED,
Packit Service fb6fa5
  CREATE_CUSTOM_WIDGET,
Packit Service fb6fa5
  CUSTOM_WIDGET_APPLY,
Packit Service fb6fa5
  PREVIEW,
Packit Service fb6fa5
  UPDATE_CUSTOM_WIDGET,
Packit Service fb6fa5
  LAST_SIGNAL
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
enum 
Packit Service fb6fa5
{
Packit Service fb6fa5
  PROP_0,
Packit Service fb6fa5
  PROP_DEFAULT_PAGE_SETUP,
Packit Service fb6fa5
  PROP_PRINT_SETTINGS,
Packit Service fb6fa5
  PROP_JOB_NAME,
Packit Service fb6fa5
  PROP_N_PAGES,
Packit Service fb6fa5
  PROP_CURRENT_PAGE,
Packit Service fb6fa5
  PROP_USE_FULL_PAGE,
Packit Service fb6fa5
  PROP_TRACK_PRINT_STATUS,
Packit Service fb6fa5
  PROP_UNIT,
Packit Service fb6fa5
  PROP_SHOW_PROGRESS,
Packit Service fb6fa5
  PROP_ALLOW_ASYNC,
Packit Service fb6fa5
  PROP_EXPORT_FILENAME,
Packit Service fb6fa5
  PROP_STATUS,
Packit Service fb6fa5
  PROP_STATUS_STRING,
Packit Service fb6fa5
  PROP_CUSTOM_TAB_LABEL,
Packit Service fb6fa5
  PROP_EMBED_PAGE_SETUP,
Packit Service fb6fa5
  PROP_HAS_SELECTION,
Packit Service fb6fa5
  PROP_SUPPORT_SELECTION,
Packit Service fb6fa5
  PROP_N_PAGES_TO_PRINT
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static guint signals[LAST_SIGNAL] = { 0 };
Packit Service fb6fa5
static int job_nr = 0;
Packit Service fb6fa5
typedef struct _PrintPagesData PrintPagesData;
Packit Service fb6fa5
Packit Service fb6fa5
static void          preview_iface_init      (GtkPrintOperationPreviewIface *iface);
Packit Service fb6fa5
static GtkPageSetup *create_page_setup       (GtkPrintOperation             *op);
Packit Service fb6fa5
static void          common_render_page      (GtkPrintOperation             *op,
Packit Service fb6fa5
					      gint                           page_nr);
Packit Service fb6fa5
static void          increment_page_sequence (PrintPagesData *data);
Packit Service fb6fa5
static void          prepare_data            (PrintPagesData *data);
Packit Service fb6fa5
static void          clamp_page_ranges       (PrintPagesData *data);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE_WITH_CODE (GtkPrintOperation, gtk_print_operation, G_TYPE_OBJECT,
Packit Service fb6fa5
			 G_IMPLEMENT_INTERFACE (GTK_TYPE_PRINT_OPERATION_PREVIEW,
Packit Service fb6fa5
						preview_iface_init))
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_error_quark:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Registers an error quark for #GtkPrintOperation if necessary.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: The error quark used for #GtkPrintOperation errors.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GQuark     
Packit Service fb6fa5
gtk_print_error_quark (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  static GQuark quark = 0;
Packit Service fb6fa5
  if (quark == 0)
Packit Service fb6fa5
    quark = g_quark_from_static_string ("gtk-print-error-quark");
Packit Service fb6fa5
  return quark;
Packit Service fb6fa5
}
Packit Service fb6fa5
     
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_operation_finalize (GObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *print_operation = GTK_PRINT_OPERATION (object);
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = print_operation->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->free_platform_data &&
Packit Service fb6fa5
      priv->platform_data)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->free_platform_data (priv->platform_data);
Packit Service fb6fa5
      priv->free_platform_data = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->default_page_setup)
Packit Service fb6fa5
    g_object_unref (priv->default_page_setup);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (priv->print_settings)
Packit Service fb6fa5
    g_object_unref (priv->print_settings);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (priv->print_context)
Packit Service fb6fa5
    g_object_unref (priv->print_context);
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (priv->export_filename);
Packit Service fb6fa5
  g_free (priv->job_name);
Packit Service fb6fa5
  g_free (priv->custom_tab_label);
Packit Service fb6fa5
  g_free (priv->status_string);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->print_pages_idle_id > 0)
Packit Service fb6fa5
    g_source_remove (priv->print_pages_idle_id);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->show_progress_timeout_id > 0)
Packit Service fb6fa5
    g_source_remove (priv->show_progress_timeout_id);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->error)
Packit Service fb6fa5
    g_error_free (priv->error);
Packit Service fb6fa5
  
Packit Service fb6fa5
  G_OBJECT_CLASS (gtk_print_operation_parent_class)->finalize (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_operation_init (GtkPrintOperation *operation)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
  const char *appname;
Packit Service fb6fa5
Packit Service fb6fa5
  priv = operation->priv = GTK_PRINT_OPERATION_GET_PRIVATE (operation);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->status = GTK_PRINT_STATUS_INITIAL;
Packit Service fb6fa5
  priv->status_string = g_strdup ("");
Packit Service fb6fa5
  priv->default_page_setup = NULL;
Packit Service fb6fa5
  priv->print_settings = NULL;
Packit Service fb6fa5
  priv->nr_of_pages = -1;
Packit Service fb6fa5
  priv->nr_of_pages_to_print = -1;
Packit Service fb6fa5
  priv->page_position = -1;
Packit Service fb6fa5
  priv->current_page = -1;
Packit Service fb6fa5
  priv->use_full_page = FALSE;
Packit Service fb6fa5
  priv->show_progress = FALSE;
Packit Service fb6fa5
  priv->export_filename = NULL;
Packit Service fb6fa5
  priv->track_print_status = FALSE;
Packit Service fb6fa5
  priv->is_sync = FALSE;
Packit Service fb6fa5
  priv->support_selection = FALSE;
Packit Service fb6fa5
  priv->has_selection = FALSE;
Packit Service fb6fa5
  priv->embed_page_setup = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  priv->page_drawing_state = GTK_PAGE_DRAWING_STATE_READY;
Packit Service fb6fa5
Packit Service fb6fa5
  priv->rloop = NULL;
Packit Service fb6fa5
  priv->unit = GTK_UNIT_PIXEL;
Packit Service fb6fa5
Packit Service fb6fa5
  appname = g_get_application_name ();
Packit Service fb6fa5
  if (appname == NULL)
Packit Service fb6fa5
    appname = "";
Packit Service fb6fa5
  /* translators: this string is the default job title for print
Packit Service fb6fa5
   * jobs. %s gets replaced by the application name, %d gets replaced
Packit Service fb6fa5
   * by the job number.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  priv->job_name = g_strdup_printf (_("%s job #%d"), appname, ++job_nr);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_iface_render_page (GtkPrintOperationPreview *preview,
Packit Service fb6fa5
			   gint                      page_nr)
Packit Service fb6fa5
{
Packit Service fb6fa5
Packit Service fb6fa5
  GtkPrintOperation *op;
Packit Service fb6fa5
Packit Service fb6fa5
  op = GTK_PRINT_OPERATION (preview);
Packit Service fb6fa5
  common_render_page (op, page_nr);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_iface_end_preview (GtkPrintOperationPreview *preview)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op;
Packit Service fb6fa5
  
Packit Service fb6fa5
  op = GTK_PRINT_OPERATION (preview);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (op, signals[END_PRINT], 0, op->priv->print_context);
Packit Service fb6fa5
Packit Service fb6fa5
  if (op->priv->rloop)
Packit Service fb6fa5
    g_main_loop_quit (op->priv->rloop);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (op->priv->end_run)
Packit Service fb6fa5
    op->priv->end_run (op, op->priv->is_sync, TRUE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  _gtk_print_operation_set_status (op, GTK_PRINT_STATUS_FINISHED, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (op, signals[DONE], 0, GTK_PRINT_OPERATION_RESULT_APPLY);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
preview_iface_is_selected (GtkPrintOperationPreview *preview,
Packit Service fb6fa5
			   gint                      page_nr)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op;
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  
Packit Service fb6fa5
  op = GTK_PRINT_OPERATION (preview);
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
  
Packit Service fb6fa5
  switch (priv->print_pages)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GTK_PRINT_PAGES_SELECTION:
Packit Service fb6fa5
    case GTK_PRINT_PAGES_ALL:
Packit Service fb6fa5
      return (page_nr >= 0) && (page_nr < priv->nr_of_pages);
Packit Service fb6fa5
    case GTK_PRINT_PAGES_CURRENT:
Packit Service fb6fa5
      return page_nr == priv->current_page;
Packit Service fb6fa5
    case GTK_PRINT_PAGES_RANGES:
Packit Service fb6fa5
      for (i = 0; i < priv->num_page_ranges; i++)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if (page_nr >= priv->page_ranges[i].start &&
Packit Service fb6fa5
	      (page_nr <= priv->page_ranges[i].end || priv->page_ranges[i].end == -1))
Packit Service fb6fa5
	    return TRUE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      return FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_iface_init (GtkPrintOperationPreviewIface *iface)
Packit Service fb6fa5
{
Packit Service fb6fa5
  iface->render_page = preview_iface_render_page;
Packit Service fb6fa5
  iface->end_preview = preview_iface_end_preview;
Packit Service fb6fa5
  iface->is_selected = preview_iface_is_selected;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_start_page (GtkPrintOperation *op,
Packit Service fb6fa5
		    GtkPrintContext   *print_context,
Packit Service fb6fa5
		    GtkPageSetup      *page_setup)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if ((op->priv->manual_number_up < 2) ||
Packit Service fb6fa5
      (op->priv->page_position % op->priv->manual_number_up == 0))
Packit Service fb6fa5
    g_signal_emit_by_name (op, "got-page-size", print_context, page_setup);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_end_page (GtkPrintOperation *op,
Packit Service fb6fa5
		  GtkPrintContext   *print_context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  cairo_t *cr;
Packit Service fb6fa5
Packit Service fb6fa5
  cr = gtk_print_context_get_cairo_context (print_context);
Packit Service fb6fa5
Packit Service fb6fa5
  if ((op->priv->manual_number_up < 2) ||
Packit Service fb6fa5
      ((op->priv->page_position + 1) % op->priv->manual_number_up == 0) ||
Packit Service fb6fa5
      (op->priv->page_position == op->priv->nr_of_pages_to_print - 1))
Packit Service fb6fa5
    cairo_show_page (cr);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_end_run (GtkPrintOperation *op,
Packit Service fb6fa5
		 gboolean           wait,
Packit Service fb6fa5
		 gboolean           cancelled)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_free (op->priv->page_ranges);
Packit Service fb6fa5
  op->priv->page_ranges = NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_operation_set_property (GObject      *object,
Packit Service fb6fa5
				  guint         prop_id,
Packit Service fb6fa5
				  const GValue *value,
Packit Service fb6fa5
				  GParamSpec   *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op = GTK_PRINT_OPERATION (object);
Packit Service fb6fa5
  
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_DEFAULT_PAGE_SETUP:
Packit Service fb6fa5
      gtk_print_operation_set_default_page_setup (op, g_value_get_object (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_PRINT_SETTINGS:
Packit Service fb6fa5
      gtk_print_operation_set_print_settings (op, g_value_get_object (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_JOB_NAME:
Packit Service fb6fa5
      gtk_print_operation_set_job_name (op, g_value_get_string (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_N_PAGES:
Packit Service fb6fa5
      gtk_print_operation_set_n_pages (op, g_value_get_int (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_CURRENT_PAGE:
Packit Service fb6fa5
      gtk_print_operation_set_current_page (op, g_value_get_int (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_USE_FULL_PAGE:
Packit Service fb6fa5
      gtk_print_operation_set_use_full_page (op, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_TRACK_PRINT_STATUS:
Packit Service fb6fa5
      gtk_print_operation_set_track_print_status (op, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_UNIT:
Packit Service fb6fa5
      gtk_print_operation_set_unit (op, g_value_get_enum (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_ALLOW_ASYNC:
Packit Service fb6fa5
      gtk_print_operation_set_allow_async (op, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_SHOW_PROGRESS:
Packit Service fb6fa5
      gtk_print_operation_set_show_progress (op, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_EXPORT_FILENAME:
Packit Service fb6fa5
      gtk_print_operation_set_export_filename (op, g_value_get_string (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_CUSTOM_TAB_LABEL:
Packit Service fb6fa5
      gtk_print_operation_set_custom_tab_label (op, g_value_get_string (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_EMBED_PAGE_SETUP:
Packit Service fb6fa5
      gtk_print_operation_set_embed_page_setup (op, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_HAS_SELECTION:
Packit Service fb6fa5
      gtk_print_operation_set_has_selection (op, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_SUPPORT_SELECTION:
Packit Service fb6fa5
      gtk_print_operation_set_support_selection (op, g_value_get_boolean (value));
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_operation_get_property (GObject    *object,
Packit Service fb6fa5
				  guint       prop_id,
Packit Service fb6fa5
				  GValue     *value,
Packit Service fb6fa5
				  GParamSpec *pspec)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op = GTK_PRINT_OPERATION (object);
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  switch (prop_id)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case PROP_DEFAULT_PAGE_SETUP:
Packit Service fb6fa5
      g_value_set_object (value, priv->default_page_setup);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_PRINT_SETTINGS:
Packit Service fb6fa5
      g_value_set_object (value, priv->print_settings);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_JOB_NAME:
Packit Service fb6fa5
      g_value_set_string (value, priv->job_name);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_N_PAGES:
Packit Service fb6fa5
      g_value_set_int (value, priv->nr_of_pages);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_CURRENT_PAGE:
Packit Service fb6fa5
      g_value_set_int (value, priv->current_page);
Packit Service fb6fa5
      break;      
Packit Service fb6fa5
    case PROP_USE_FULL_PAGE:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->use_full_page);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_TRACK_PRINT_STATUS:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->track_print_status);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_UNIT:
Packit Service fb6fa5
      g_value_set_enum (value, priv->unit);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_ALLOW_ASYNC:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->allow_async);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_SHOW_PROGRESS:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->show_progress);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_EXPORT_FILENAME:
Packit Service fb6fa5
      g_value_set_string (value, priv->export_filename);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_STATUS:
Packit Service fb6fa5
      g_value_set_enum (value, priv->status);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_STATUS_STRING:
Packit Service fb6fa5
      g_value_set_string (value, priv->status_string);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_CUSTOM_TAB_LABEL:
Packit Service fb6fa5
      g_value_set_string (value, priv->custom_tab_label);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_EMBED_PAGE_SETUP:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->embed_page_setup);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_HAS_SELECTION:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->has_selection);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_SUPPORT_SELECTION:
Packit Service fb6fa5
      g_value_set_boolean (value, priv->support_selection);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case PROP_N_PAGES_TO_PRINT:
Packit Service fb6fa5
      g_value_set_int (value, priv->nr_of_pages_to_print);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
struct _PrintPagesData
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op;
Packit Service fb6fa5
  gint uncollated_copies;
Packit Service fb6fa5
  gint collated_copies;
Packit Service fb6fa5
  gint uncollated, collated, total;
Packit Service fb6fa5
Packit Service fb6fa5
  gint range, num_ranges;
Packit Service fb6fa5
  GtkPageRange *ranges;
Packit Service fb6fa5
  GtkPageRange one_range;
Packit Service fb6fa5
Packit Service fb6fa5
  gint page;
Packit Service fb6fa5
  gint sheet;
Packit Service fb6fa5
  gint first_position, last_position;
Packit Service fb6fa5
  gint first_sheet;
Packit Service fb6fa5
  gint num_of_sheets;
Packit Service fb6fa5
  gint *pages;
Packit Service fb6fa5
Packit Service fb6fa5
  GtkWidget *progress;
Packit Service fb6fa5
 
Packit Service fb6fa5
  gboolean initialized;
Packit Service fb6fa5
  gboolean is_preview;
Packit Service fb6fa5
  gboolean done;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPreview *preview;
Packit Service fb6fa5
  GtkPrintContext *print_context;
Packit Service fb6fa5
  GtkWindow *parent;
Packit Service fb6fa5
  cairo_surface_t *surface;
Packit Service fb6fa5
  gchar *filename;
Packit Service fb6fa5
  gboolean wait;
Packit Service fb6fa5
  PrintPagesData *pages_data;
Packit Service fb6fa5
} PreviewOp;
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_print_idle_done (gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op;
Packit Service fb6fa5
  PreviewOp *pop = (PreviewOp *) data;
Packit Service fb6fa5
Packit Service fb6fa5
  op = GTK_PRINT_OPERATION (pop->preview);
Packit Service fb6fa5
Packit Service fb6fa5
  cairo_surface_finish (pop->surface);
Packit Service fb6fa5
  /* Surface is destroyed in launch_preview */
Packit Service fb6fa5
  _gtk_print_operation_platform_backend_launch_preview (op,
Packit Service fb6fa5
							pop->surface,
Packit Service fb6fa5
							pop->parent,
Packit Service fb6fa5
							pop->filename);
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (pop->filename);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_print_operation_preview_end_preview (pop->preview);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (pop->pages_data->op);
Packit Service fb6fa5
  g_free (pop->pages_data->pages);
Packit Service fb6fa5
  g_free (pop->pages_data);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (op);
Packit Service fb6fa5
  g_free (pop);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
preview_print_idle (gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PreviewOp *pop;
Packit Service fb6fa5
  GtkPrintOperation *op;
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv; 
Packit Service fb6fa5
  gboolean done = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  pop = (PreviewOp *) data;
Packit Service fb6fa5
  op = GTK_PRINT_OPERATION (pop->preview);
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_READY)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!pop->pages_data->initialized)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          pop->pages_data->initialized = TRUE;
Packit Service fb6fa5
          prepare_data (pop->pages_data);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          increment_page_sequence (pop->pages_data);
Packit Service fb6fa5
Packit Service fb6fa5
          if (!pop->pages_data->done)
Packit Service fb6fa5
            gtk_print_operation_preview_render_page (pop->preview, pop->pages_data->page);
Packit Service fb6fa5
          else
Packit Service fb6fa5
            done = priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_READY;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return !done;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_got_page_size (GtkPrintOperationPreview *preview, 
Packit Service fb6fa5
		       GtkPrintContext          *context,
Packit Service fb6fa5
		       GtkPageSetup             *page_setup,
Packit Service fb6fa5
		       PreviewOp                *pop)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op = GTK_PRINT_OPERATION (preview);
Packit Service fb6fa5
  cairo_t *cr;
Packit Service fb6fa5
Packit Service fb6fa5
  _gtk_print_operation_platform_backend_resize_preview_surface (op, page_setup, pop->surface);
Packit Service fb6fa5
Packit Service fb6fa5
  cr = gtk_print_context_get_cairo_context (pop->print_context);
Packit Service fb6fa5
  _gtk_print_operation_platform_backend_preview_start_page (op, pop->surface, cr);
Packit Service fb6fa5
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
preview_ready (GtkPrintOperationPreview *preview,
Packit Service fb6fa5
               GtkPrintContext          *context,
Packit Service fb6fa5
	       PreviewOp                *pop)
Packit Service fb6fa5
{
Packit Service fb6fa5
  pop->print_context = context;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_ref (preview);
Packit Service fb6fa5
      
Packit Service fb6fa5
  gdk_threads_add_idle_full (G_PRIORITY_DEFAULT_IDLE + 10,
Packit Service fb6fa5
	                     preview_print_idle,
Packit Service fb6fa5
		             pop,
Packit Service fb6fa5
		             preview_print_idle_done);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_print_operation_preview_handler (GtkPrintOperation        *op,
Packit Service fb6fa5
                                     GtkPrintOperationPreview *preview, 
Packit Service fb6fa5
				     GtkPrintContext          *context,
Packit Service fb6fa5
				     GtkWindow                *parent)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdouble dpi_x, dpi_y;
Packit Service fb6fa5
  PreviewOp *pop;
Packit Service fb6fa5
  GtkPageSetup *page_setup;
Packit Service fb6fa5
  cairo_t *cr;
Packit Service fb6fa5
Packit Service fb6fa5
  pop = g_new0 (PreviewOp, 1);
Packit Service fb6fa5
  pop->filename = NULL;
Packit Service fb6fa5
  pop->preview = preview;
Packit Service fb6fa5
  pop->parent = parent;
Packit Service fb6fa5
  pop->pages_data = g_new0 (PrintPagesData, 1);
Packit Service fb6fa5
  pop->pages_data->op = g_object_ref (GTK_PRINT_OPERATION (preview));
Packit Service fb6fa5
  pop->pages_data->is_preview = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  page_setup = gtk_print_context_get_page_setup (context);
Packit Service fb6fa5
Packit Service fb6fa5
  pop->surface =
Packit Service fb6fa5
    _gtk_print_operation_platform_backend_create_preview_surface (op,
Packit Service fb6fa5
								  page_setup,
Packit Service fb6fa5
								  &dpi_x, &dpi_y,
Packit Service fb6fa5
								  &pop->filename);
Packit Service fb6fa5
Packit Service fb6fa5
  if (pop->surface == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_free (pop);
Packit Service fb6fa5
      return FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  cr = cairo_create (pop->surface);
Packit Service fb6fa5
  gtk_print_context_set_cairo_context (op->priv->print_context, cr,
Packit Service fb6fa5
				       dpi_x, dpi_y);
Packit Service fb6fa5
  cairo_destroy (cr);
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_connect (preview, "ready", (GCallback) preview_ready, pop);
Packit Service fb6fa5
  g_signal_connect (preview, "got-page-size", (GCallback) preview_got_page_size, pop);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkWidget *
Packit Service fb6fa5
gtk_print_operation_create_custom_widget (GtkPrintOperation *operation)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gtk_print_operation_paginate (GtkPrintOperation *operation,
Packit Service fb6fa5
                              GtkPrintContext   *context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* assume the number of pages is already set and pagination is not needed */
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_operation_done (GtkPrintOperation       *operation,
Packit Service fb6fa5
                          GtkPrintOperationResult  result)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = operation->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->print_context)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_object_unref (priv->print_context);
Packit Service fb6fa5
      priv->print_context = NULL;
Packit Service fb6fa5
    } 
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
custom_widget_accumulator (GSignalInvocationHint *ihint,
Packit Service fb6fa5
			   GValue                *return_accu,
Packit Service fb6fa5
			   const GValue          *handler_return,
Packit Service fb6fa5
			   gpointer               dummy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean continue_emission;
Packit Service fb6fa5
  GtkWidget *widget;
Packit Service fb6fa5
  
Packit Service fb6fa5
  widget = g_value_get_object (handler_return);
Packit Service fb6fa5
  if (widget != NULL)
Packit Service fb6fa5
    g_value_set_object (return_accu, widget);
Packit Service fb6fa5
  continue_emission = (widget == NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return continue_emission;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
paginate_accumulator (GSignalInvocationHint *ihint,
Packit Service fb6fa5
                      GValue                *return_accu,
Packit Service fb6fa5
                      const GValue          *handler_return,
Packit Service fb6fa5
                      gpointer               dummy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  *return_accu = *handler_return;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Stop signal emission on first invocation, so if it's a callback then
Packit Service fb6fa5
   * the default handler won't run. */
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_operation_class_init (GtkPrintOperationClass *class)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObjectClass *gobject_class = (GObjectClass *)class;
Packit Service fb6fa5
Packit Service fb6fa5
  gobject_class->set_property = gtk_print_operation_set_property;
Packit Service fb6fa5
  gobject_class->get_property = gtk_print_operation_get_property;
Packit Service fb6fa5
  gobject_class->finalize = gtk_print_operation_finalize;
Packit Service fb6fa5
 
Packit Service fb6fa5
  class->preview = gtk_print_operation_preview_handler; 
Packit Service fb6fa5
  class->create_custom_widget = gtk_print_operation_create_custom_widget;
Packit Service fb6fa5
  class->paginate = gtk_print_operation_paginate;
Packit Service fb6fa5
  class->done = gtk_print_operation_done;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_type_class_add_private (gobject_class, sizeof (GtkPrintOperationPrivate));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::done:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @result: the result of the print operation
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted when the print operation run has finished doing
Packit Service fb6fa5
   * everything required for printing. 
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * @result gives you information about what happened during the run. 
Packit Service fb6fa5
   * If @result is %GTK_PRINT_OPERATION_RESULT_ERROR then you can call
Packit Service fb6fa5
   * gtk_print_operation_get_error() for more information.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If you enabled print status tracking then 
Packit Service fb6fa5
   * gtk_print_operation_is_finished() may still return %FALSE 
Packit Service fb6fa5
   * after #GtkPrintOperation::done was emitted.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[DONE] =
Packit Service fb6fa5
    g_signal_new (I_("done"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (gobject_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, done),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  g_cclosure_marshal_VOID__ENUM,
Packit Service fb6fa5
		  G_TYPE_NONE, 1, GTK_TYPE_PRINT_OPERATION_RESULT);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::begin-print:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @context: the #GtkPrintContext for the current operation
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted after the user has finished changing print settings
Packit Service fb6fa5
   * in the dialog, before the actual rendering starts. 
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * A typical use for ::begin-print is to use the parameters from the
Packit Service fb6fa5
   * #GtkPrintContext and paginate the document accordingly, and then
Packit Service fb6fa5
   * set the number of pages with gtk_print_operation_set_n_pages().
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[BEGIN_PRINT] =
Packit Service fb6fa5
    g_signal_new (I_("begin-print"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (gobject_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, begin_print),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  g_cclosure_marshal_VOID__OBJECT,
Packit Service fb6fa5
		  G_TYPE_NONE, 1, GTK_TYPE_PRINT_CONTEXT);
Packit Service fb6fa5
Packit Service fb6fa5
   /**
Packit Service fb6fa5
   * GtkPrintOperation::paginate:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @context: the #GtkPrintContext for the current operation
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted after the #GtkPrintOperation::begin-print signal, but before 
Packit Service fb6fa5
   * the actual rendering starts. It keeps getting emitted until a connected 
Packit Service fb6fa5
   * signal handler returns %TRUE.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The ::paginate signal is intended to be used for paginating a document
Packit Service fb6fa5
   * in small chunks, to avoid blocking the user interface for a long
Packit Service fb6fa5
   * time. The signal handler should update the number of pages using
Packit Service fb6fa5
   * gtk_print_operation_set_n_pages(), and return %TRUE if the document
Packit Service fb6fa5
   * has been completely paginated.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If you don't need to do pagination in chunks, you can simply do
Packit Service fb6fa5
   * it all in the ::begin-print handler, and set the number of pages
Packit Service fb6fa5
   * from there.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Return value: %TRUE if pagination is complete
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[PAGINATE] =
Packit Service fb6fa5
    g_signal_new (I_("paginate"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (gobject_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, paginate),
Packit Service fb6fa5
		  paginate_accumulator, NULL,
Packit Service fb6fa5
		  _gtk_marshal_BOOLEAN__OBJECT,
Packit Service fb6fa5
		  G_TYPE_BOOLEAN, 1, GTK_TYPE_PRINT_CONTEXT);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::request-page-setup:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @context: the #GtkPrintContext for the current operation
Packit Service fb6fa5
   * @page_nr: the number of the currently printed page (0-based)
Packit Service fb6fa5
   * @setup: the #GtkPageSetup 
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Emitted once for every page that is printed, to give
Packit Service fb6fa5
   * the application a chance to modify the page setup. Any changes 
Packit Service fb6fa5
   * done to @setup will be in force only for printing this page.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[REQUEST_PAGE_SETUP] =
Packit Service fb6fa5
    g_signal_new (I_("request-page-setup"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (gobject_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, request_page_setup),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__OBJECT_INT_OBJECT,
Packit Service fb6fa5
		  G_TYPE_NONE, 3,
Packit Service fb6fa5
		  GTK_TYPE_PRINT_CONTEXT,
Packit Service fb6fa5
		  G_TYPE_INT,
Packit Service fb6fa5
		  GTK_TYPE_PAGE_SETUP);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::draw-page:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @context: the #GtkPrintContext for the current operation
Packit Service fb6fa5
   * @page_nr: the number of the currently printed page (0-based)
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted for every page that is printed. The signal handler
Packit Service fb6fa5
   * must render the @page_nr's page onto the cairo context obtained
Packit Service fb6fa5
   * from @context using gtk_print_context_get_cairo_context().
Packit Service fb6fa5
   * |[
Packit Service fb6fa5
   * static void
Packit Service fb6fa5
   * draw_page (GtkPrintOperation *operation,
Packit Service fb6fa5
   *            GtkPrintContext   *context,
Packit Service fb6fa5
   *            gint               page_nr,
Packit Service fb6fa5
   *            gpointer           user_data)
Packit Service fb6fa5
   * {
Packit Service fb6fa5
   *   cairo_t *cr;
Packit Service fb6fa5
   *   PangoLayout *layout;
Packit Service fb6fa5
   *   gdouble width, text_height;
Packit Service fb6fa5
   *   gint layout_height;
Packit Service fb6fa5
   *   PangoFontDescription *desc;
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   cr = gtk_print_context_get_cairo_context (context);
Packit Service fb6fa5
   *   width = gtk_print_context_get_width (context);
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   cairo_rectangle (cr, 0, 0, width, HEADER_HEIGHT);
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   cairo_set_source_rgb (cr, 0.8, 0.8, 0.8);
Packit Service fb6fa5
   *   cairo_fill (cr);
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   layout = gtk_print_context_create_pango_layout (context);
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   desc = pango_font_description_from_string ("sans 14");
Packit Service fb6fa5
   *   pango_layout_set_font_description (layout, desc);
Packit Service fb6fa5
   *   pango_font_description_free (desc);
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   pango_layout_set_text (layout, "some text", -1);
Packit Service fb6fa5
   *   pango_layout_set_width (layout, width * PANGO_SCALE);
Packit Service fb6fa5
   *   pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
Packit Service fb6fa5
   *      		      
Packit Service fb6fa5
   *   pango_layout_get_size (layout, NULL, &layout_height);
Packit Service fb6fa5
   *   text_height = (gdouble)layout_height / PANGO_SCALE;
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   cairo_move_to (cr, width / 2,  (HEADER_HEIGHT - text_height) / 2);
Packit Service fb6fa5
   *   pango_cairo_show_layout (cr, layout);
Packit Service fb6fa5
   *   
Packit Service fb6fa5
   *   g_object_unref (layout);
Packit Service fb6fa5
   * }
Packit Service fb6fa5
   * ]|
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Use gtk_print_operation_set_use_full_page() and 
Packit Service fb6fa5
   * gtk_print_operation_set_unit() before starting the print operation
Packit Service fb6fa5
   * to set up the transformation of the cairo context according to your
Packit Service fb6fa5
   * needs.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[DRAW_PAGE] =
Packit Service fb6fa5
    g_signal_new (I_("draw-page"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (gobject_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, draw_page),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__OBJECT_INT,
Packit Service fb6fa5
		  G_TYPE_NONE, 2,
Packit Service fb6fa5
		  GTK_TYPE_PRINT_CONTEXT,
Packit Service fb6fa5
		  G_TYPE_INT);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::end-print:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @context: the #GtkPrintContext for the current operation
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted after all pages have been rendered. 
Packit Service fb6fa5
   * A handler for this signal can clean up any resources that have
Packit Service fb6fa5
   * been allocated in the #GtkPrintOperation::begin-print handler.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[END_PRINT] =
Packit Service fb6fa5
    g_signal_new (I_("end-print"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (gobject_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, end_print),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  g_cclosure_marshal_VOID__OBJECT,
Packit Service fb6fa5
		  G_TYPE_NONE, 1, GTK_TYPE_PRINT_CONTEXT);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::status-changed:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted at between the various phases of the print operation.
Packit Service fb6fa5
   * See #GtkPrintStatus for the phases that are being discriminated.
Packit Service fb6fa5
   * Use gtk_print_operation_get_status() to find out the current
Packit Service fb6fa5
   * status.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[STATUS_CHANGED] =
Packit Service fb6fa5
    g_signal_new (I_("status-changed"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, status_changed),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  g_cclosure_marshal_VOID__VOID,
Packit Service fb6fa5
		  G_TYPE_NONE, 0);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::create-custom-widget:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted when displaying the print dialog. If you return a
Packit Service fb6fa5
   * widget in a handler for this signal it will be added to a custom
Packit Service fb6fa5
   * tab in the print dialog. You typically return a container widget
Packit Service fb6fa5
   * with multiple widgets in it.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The print dialog owns the returned widget, and its lifetime is not 
Packit Service fb6fa5
   * controlled by the application. However, the widget is guaranteed 
Packit Service fb6fa5
   * to stay around until the #GtkPrintOperation::custom-widget-apply 
Packit Service fb6fa5
   * signal is emitted on the operation. Then you can read out any 
Packit Service fb6fa5
   * information you need from the widgets.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Returns: (transfer none): A custom widget that gets embedded in
Packit Service fb6fa5
   *          the print dialog, or %NULL
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[CREATE_CUSTOM_WIDGET] =
Packit Service fb6fa5
    g_signal_new (I_("create-custom-widget"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, create_custom_widget),
Packit Service fb6fa5
		  custom_widget_accumulator, NULL,
Packit Service fb6fa5
		  _gtk_marshal_OBJECT__VOID,
Packit Service fb6fa5
		  G_TYPE_OBJECT, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::update-custom-widget:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @widget: the custom widget added in create-custom-widget
Packit Service fb6fa5
   * @setup: actual page setup
Packit Service fb6fa5
   * @settings: actual print settings
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted after change of selected printer. The actual page setup and
Packit Service fb6fa5
   * print settings are passed to the custom widget, which can actualize
Packit Service fb6fa5
   * itself according to this change.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.18
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[UPDATE_CUSTOM_WIDGET] =
Packit Service fb6fa5
    g_signal_new (I_("update-custom-widget"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, update_custom_widget),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gtk_marshal_VOID__OBJECT_OBJECT_OBJECT,
Packit Service fb6fa5
		  G_TYPE_NONE, 3, GTK_TYPE_WIDGET, GTK_TYPE_PAGE_SETUP, GTK_TYPE_PRINT_SETTINGS);
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation::custom-widget-apply:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @widget: the custom widget added in create-custom-widget
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Emitted right before #GtkPrintOperation::begin-print if you added
Packit Service fb6fa5
   * a custom widget in the #GtkPrintOperation::create-custom-widget handler. 
Packit Service fb6fa5
   * When you get this signal you should read the information from the 
Packit Service fb6fa5
   * custom widgets, as the widgets are not guaraneed to be around at a 
Packit Service fb6fa5
   * later time.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[CUSTOM_WIDGET_APPLY] =
Packit Service fb6fa5
    g_signal_new (I_("custom-widget-apply"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, custom_widget_apply),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  g_cclosure_marshal_VOID__OBJECT,
Packit Service fb6fa5
		  G_TYPE_NONE, 1, GTK_TYPE_WIDGET);
Packit Service fb6fa5
Packit Service fb6fa5
   /**
Packit Service fb6fa5
   * GtkPrintOperation::preview:
Packit Service fb6fa5
   * @operation: the #GtkPrintOperation on which the signal was emitted
Packit Service fb6fa5
   * @preview: the #GtkPrintPreviewOperation for the current operation
Packit Service fb6fa5
   * @context: the #GtkPrintContext that will be used
Packit Service fb6fa5
   * @parent: (allow-none): the #GtkWindow to use as window parent, or %NULL
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Gets emitted when a preview is requested from the native dialog.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The default handler for this signal uses an external viewer 
Packit Service fb6fa5
   * application to preview.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * To implement a custom print preview, an application must return
Packit Service fb6fa5
   * %TRUE from its handler for this signal. In order to use the
Packit Service fb6fa5
   * provided @context for the preview implementation, it must be
Packit Service fb6fa5
   * given a suitable cairo context with gtk_print_context_set_cairo_context().
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * The custom preview implementation can use 
Packit Service fb6fa5
   * gtk_print_operation_preview_is_selected() and 
Packit Service fb6fa5
   * gtk_print_operation_preview_render_page() to find pages which
Packit Service fb6fa5
   * are selected for print and render them. The preview must be
Packit Service fb6fa5
   * finished by calling gtk_print_operation_preview_end_preview()
Packit Service fb6fa5
   * (typically in response to the user clicking a close button).
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Returns: %TRUE if the listener wants to take over control of the preview
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  signals[PREVIEW] =
Packit Service fb6fa5
    g_signal_new (I_("preview"),
Packit Service fb6fa5
		  G_TYPE_FROM_CLASS (gobject_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GtkPrintOperationClass, preview),
Packit Service fb6fa5
		  _gtk_boolean_handled_accumulator, NULL,
Packit Service fb6fa5
		  _gtk_marshal_BOOLEAN__OBJECT_OBJECT_OBJECT,
Packit Service fb6fa5
		  G_TYPE_BOOLEAN, 3,
Packit Service fb6fa5
		  GTK_TYPE_PRINT_OPERATION_PREVIEW,
Packit Service fb6fa5
		  GTK_TYPE_PRINT_CONTEXT,
Packit Service fb6fa5
		  GTK_TYPE_WINDOW);
Packit Service fb6fa5
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:default-page-setup:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The #GtkPageSetup used by default.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * This page setup will be used by gtk_print_operation_run(),
Packit Service fb6fa5
   * but it can be overridden on a per-page basis by connecting
Packit Service fb6fa5
   * to the #GtkPrintOperation::request-page-setup signal.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_DEFAULT_PAGE_SETUP,
Packit Service fb6fa5
				   g_param_spec_object ("default-page-setup",
Packit Service fb6fa5
							P_("Default Page Setup"),
Packit Service fb6fa5
							P_("The GtkPageSetup used by default"),
Packit Service fb6fa5
							GTK_TYPE_PAGE_SETUP,
Packit Service fb6fa5
							GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:print-settings:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The #GtkPrintSettings used for initializing the dialog.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Setting this property is typically used to re-establish 
Packit Service fb6fa5
   * print settings from a previous print operation, see 
Packit Service fb6fa5
   * gtk_print_operation_run().
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_PRINT_SETTINGS,
Packit Service fb6fa5
				   g_param_spec_object ("print-settings",
Packit Service fb6fa5
							P_("Print Settings"),
Packit Service fb6fa5
							P_("The GtkPrintSettings used for initializing the dialog"),
Packit Service fb6fa5
							GTK_TYPE_PRINT_SETTINGS,
Packit Service fb6fa5
							GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:job-name:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * A string used to identify the job (e.g. in monitoring 
Packit Service fb6fa5
   * applications like eggcups). 
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * If you don't set a job name, GTK+ picks a default one 
Packit Service fb6fa5
   * by numbering successive print jobs.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_JOB_NAME,
Packit Service fb6fa5
				   g_param_spec_string ("job-name",
Packit Service fb6fa5
							P_("Job Name"),
Packit Service fb6fa5
							P_("A string used for identifying the print job."),
Packit Service fb6fa5
							"",
Packit Service fb6fa5
							GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:n-pages:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The number of pages in the document. 
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * This <emphasis>must</emphasis> be set to a positive number
Packit Service fb6fa5
   * before the rendering starts. It may be set in a 
Packit Service fb6fa5
   * #GtkPrintOperation::begin-print signal hander.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Note that the page numbers passed to the 
Packit Service fb6fa5
   * #GtkPrintOperation::request-page-setup and 
Packit Service fb6fa5
   * #GtkPrintOperation::draw-page signals are 0-based, i.e. if 
Packit Service fb6fa5
   * the user chooses to print all pages, the last ::draw-page signal 
Packit Service fb6fa5
   * will be for page @n_pages - 1.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_N_PAGES,
Packit Service fb6fa5
				   g_param_spec_int ("n-pages",
Packit Service fb6fa5
						     P_("Number of Pages"),
Packit Service fb6fa5
						     P_("The number of pages in the document."),
Packit Service fb6fa5
						     -1,
Packit Service fb6fa5
						     G_MAXINT,
Packit Service fb6fa5
						     -1,
Packit Service fb6fa5
						     GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:current-page:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The current page in the document.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If this is set before gtk_print_operation_run(), 
Packit Service fb6fa5
   * the user will be able to select to print only the current page.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Note that this only makes sense for pre-paginated documents.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_CURRENT_PAGE,
Packit Service fb6fa5
				   g_param_spec_int ("current-page",
Packit Service fb6fa5
						     P_("Current Page"),
Packit Service fb6fa5
						     P_("The current page in the document"),
Packit Service fb6fa5
						     -1,
Packit Service fb6fa5
						     G_MAXINT,
Packit Service fb6fa5
						     -1,
Packit Service fb6fa5
						     GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:use-full-page:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If %TRUE, the transformation for the cairo context obtained 
Packit Service fb6fa5
   * from #GtkPrintContext puts the origin at the top left corner 
Packit Service fb6fa5
   * of the page (which may not be the top left corner of the sheet, 
Packit Service fb6fa5
   * depending on page orientation and the number of pages per sheet). 
Packit Service fb6fa5
   * Otherwise, the origin is at the top left corner of the imageable 
Packit Service fb6fa5
   * area (i.e. inside the margins).
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_USE_FULL_PAGE,
Packit Service fb6fa5
				   g_param_spec_boolean ("use-full-page",
Packit Service fb6fa5
							 P_("Use full page"),
Packit Service fb6fa5
							 P_("TRUE if the origin of the context should be at the corner of the page and not the corner of the imageable area"),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:track-print-status:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If %TRUE, the print operation will try to continue report on 
Packit Service fb6fa5
   * the status of the print job in the printer queues and printer. 
Packit Service fb6fa5
   * This can allow your application to show things like "out of paper" 
Packit Service fb6fa5
   * issues, and when the print job actually reaches the printer. 
Packit Service fb6fa5
   * However, this is often implemented using polling, and should 
Packit Service fb6fa5
   * not be enabled unless needed.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_TRACK_PRINT_STATUS,
Packit Service fb6fa5
				   g_param_spec_boolean ("track-print-status",
Packit Service fb6fa5
							 P_("Track Print Status"),
Packit Service fb6fa5
							 P_("TRUE if the print operation will continue to report on the print job status after the print data has been sent to the printer or print server."),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:unit:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The transformation for the cairo context obtained from
Packit Service fb6fa5
   * #GtkPrintContext is set up in such a way that distances 
Packit Service fb6fa5
   * are measured in units of @unit.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_UNIT,
Packit Service fb6fa5
				   g_param_spec_enum ("unit",
Packit Service fb6fa5
						      P_("Unit"),
Packit Service fb6fa5
						      P_("The unit in which distances can be measured in the context"),
Packit Service fb6fa5
						      GTK_TYPE_UNIT,
Packit Service fb6fa5
						      GTK_UNIT_PIXEL,
Packit Service fb6fa5
						      GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:show-progress:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Determines whether to show a progress dialog during the 
Packit Service fb6fa5
   * print operation.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_SHOW_PROGRESS,
Packit Service fb6fa5
				   g_param_spec_boolean ("show-progress",
Packit Service fb6fa5
							 P_("Show Dialog"),
Packit Service fb6fa5
							 P_("TRUE if a progress dialog is shown while printing."),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:allow-async:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Determines whether the print operation may run asynchronously or not.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Some systems don't support asynchronous printing, but those that do
Packit Service fb6fa5
   * will return %GTK_PRINT_OPERATION_RESULT_IN_PROGRESS as the status, and
Packit Service fb6fa5
   * emit the #GtkPrintOperation::done signal when the operation is actually 
Packit Service fb6fa5
   * done.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The Windows port does not support asynchronous operation at all (this 
Packit Service fb6fa5
   * is unlikely to change). On other platforms, all actions except for 
Packit Service fb6fa5
   * %GTK_PRINT_OPERATION_ACTION_EXPORT support asynchronous operation.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_ALLOW_ASYNC,
Packit Service fb6fa5
				   g_param_spec_boolean ("allow-async",
Packit Service fb6fa5
							 P_("Allow Async"),
Packit Service fb6fa5
							 P_("TRUE if print process may run asynchronous."),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:export-filename:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The name of a file to generate instead of showing the print dialog. 
Packit Service fb6fa5
   * Currently, PDF is the only supported format.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The intended use of this property is for implementing 
Packit Service fb6fa5
   * "Export to PDF" actions.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * "Print to PDF" support is independent of this and is done
Packit Service fb6fa5
   * by letting the user pick the "Print to PDF" item from the 
Packit Service fb6fa5
   * list of printers in the print dialog.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_EXPORT_FILENAME,
Packit Service fb6fa5
				   g_param_spec_string ("export-filename",
Packit Service fb6fa5
							P_("Export filename"),
Packit Service fb6fa5
							P_("Export filename"),
Packit Service fb6fa5
							NULL,
Packit Service fb6fa5
							GTK_PARAM_READWRITE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:status:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The status of the print operation.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_STATUS,
Packit Service fb6fa5
				   g_param_spec_enum ("status",
Packit Service fb6fa5
						      P_("Status"),
Packit Service fb6fa5
						      P_("The status of the print operation"),
Packit Service fb6fa5
						      GTK_TYPE_PRINT_STATUS,
Packit Service fb6fa5
						      GTK_PRINT_STATUS_INITIAL,
Packit Service fb6fa5
						      GTK_PARAM_READABLE));
Packit Service fb6fa5
  
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:status-string:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * A string representation of the status of the print operation. 
Packit Service fb6fa5
   * The string is translated and suitable for displaying the print 
Packit Service fb6fa5
   * status e.g. in a #GtkStatusbar.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * See the #GtkPrintOperation:status property for a status value that 
Packit Service fb6fa5
   * is suitable for programmatic use. 
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_STATUS_STRING,
Packit Service fb6fa5
				   g_param_spec_string ("status-string",
Packit Service fb6fa5
							P_("Status String"),
Packit Service fb6fa5
							P_("A human-readable description of the status"),
Packit Service fb6fa5
							"",
Packit Service fb6fa5
							GTK_PARAM_READABLE));
Packit Service fb6fa5
  
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:custom-tab-label:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Used as the label of the tab containing custom widgets.
Packit Service fb6fa5
   * Note that this property may be ignored on some platforms.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * If this is %NULL, GTK+ uses a default label.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.10
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_CUSTOM_TAB_LABEL,
Packit Service fb6fa5
				   g_param_spec_string ("custom-tab-label",
Packit Service fb6fa5
							P_("Custom tab label"),
Packit Service fb6fa5
							P_("Label for the tab containing custom widgets."),
Packit Service fb6fa5
							NULL,
Packit Service fb6fa5
							GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:support-selection:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If %TRUE, the print operation will support print of selection.
Packit Service fb6fa5
   * This allows the print dialog to show a "Selection" button.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.18
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_SUPPORT_SELECTION,
Packit Service fb6fa5
				   g_param_spec_boolean ("support-selection",
Packit Service fb6fa5
							 P_("Support Selection"),
Packit Service fb6fa5
							 P_("TRUE if the print operation will support print of selection."),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:has-selection:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Determines whether there is a selection in your application.
Packit Service fb6fa5
   * This can allow your application to print the selection.
Packit Service fb6fa5
   * This is typically used to make a "Selection" button sensitive.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.18
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_HAS_SELECTION,
Packit Service fb6fa5
				   g_param_spec_boolean ("has-selection",
Packit Service fb6fa5
							 P_("Has Selection"),
Packit Service fb6fa5
							 P_("TRUE if a selection exists."),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:embed-page-setup:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If %TRUE, page size combo box and orientation combo box are embedded into page setup page.
Packit Service fb6fa5
   * 
Packit Service fb6fa5
   * Since: 2.18
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_EMBED_PAGE_SETUP,
Packit Service fb6fa5
				   g_param_spec_boolean ("embed-page-setup",
Packit Service fb6fa5
							 P_("Embed Page Setup"),
Packit Service fb6fa5
							 P_("TRUE if page setup combos are embedded in GtkPrintDialog"),
Packit Service fb6fa5
							 FALSE,
Packit Service fb6fa5
							 GTK_PARAM_READWRITE));
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GtkPrintOperation:n-pages-to-print:
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The number of pages that will be printed.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Note that this value is set during print preparation phase
Packit Service fb6fa5
   * (%GTK_PRINT_STATUS_PREPARING), so this value should never be
Packit Service fb6fa5
   * get before the data generation phase (%GTK_PRINT_STATUS_GENERATING_DATA).
Packit Service fb6fa5
   * You can connect to the #GtkPrintOperation::status-changed signal
Packit Service fb6fa5
   * and call gtk_print_operation_get_n_pages_to_print() when
Packit Service fb6fa5
   * print status is %GTK_PRINT_STATUS_GENERATING_DATA.
Packit Service fb6fa5
   * This is typically used to track the progress of print operation.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.18
Packit Service fb6fa5
   */
Packit Service fb6fa5
  g_object_class_install_property (gobject_class,
Packit Service fb6fa5
				   PROP_N_PAGES_TO_PRINT,
Packit Service fb6fa5
				   g_param_spec_int ("n-pages-to-print",
Packit Service fb6fa5
						     P_("Number of Pages To Print"),
Packit Service fb6fa5
						     P_("The number of pages that will be printed."),
Packit Service fb6fa5
						     -1,
Packit Service fb6fa5
						     G_MAXINT,
Packit Service fb6fa5
						     -1,
Packit Service fb6fa5
						     GTK_PARAM_READABLE));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_new:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Creates a new #GtkPrintOperation. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: a new #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkPrintOperation *
Packit Service fb6fa5
gtk_print_operation_new (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *print_operation;
Packit Service fb6fa5
Packit Service fb6fa5
  print_operation = g_object_new (GTK_TYPE_PRINT_OPERATION, NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return print_operation;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_default_page_setup:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @default_page_setup: (allow-none): a #GtkPageSetup, or %NULL
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Makes @default_page_setup the default page setup for @op.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This page setup will be used by gtk_print_operation_run(),
Packit Service fb6fa5
 * but it can be overridden on a per-page basis by connecting
Packit Service fb6fa5
 * to the #GtkPrintOperation::request-page-setup signal.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_default_page_setup (GtkPrintOperation *op,
Packit Service fb6fa5
					    GtkPageSetup      *default_page_setup)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
  g_return_if_fail (default_page_setup == NULL || 
Packit Service fb6fa5
                    GTK_IS_PAGE_SETUP (default_page_setup));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (default_page_setup != priv->default_page_setup)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (default_page_setup)
Packit Service fb6fa5
	g_object_ref (default_page_setup);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (priv->default_page_setup)
Packit Service fb6fa5
	g_object_unref (priv->default_page_setup);
Packit Service fb6fa5
      
Packit Service fb6fa5
      priv->default_page_setup = default_page_setup;
Packit Service fb6fa5
     
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "default-page-setup");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_default_page_setup:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns the default page setup, see
Packit Service fb6fa5
 * gtk_print_operation_set_default_page_setup().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: (transfer none): the default page setup
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
GtkPageSetup *
Packit Service fb6fa5
gtk_print_operation_get_default_page_setup (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->default_page_setup;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_print_settings:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @print_settings: (allow-none): #GtkPrintSettings
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the print settings for @op. This is typically used to
Packit Service fb6fa5
 * re-establish print settings from a previous print operation,
Packit Service fb6fa5
 * see gtk_print_operation_run().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_print_settings (GtkPrintOperation *op,
Packit Service fb6fa5
					GtkPrintSettings  *print_settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
  g_return_if_fail (print_settings == NULL || 
Packit Service fb6fa5
                    GTK_IS_PRINT_SETTINGS (print_settings));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (print_settings != priv->print_settings)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (print_settings)
Packit Service fb6fa5
        g_object_ref (print_settings);
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->print_settings)
Packit Service fb6fa5
        g_object_unref (priv->print_settings);
Packit Service fb6fa5
  
Packit Service fb6fa5
      priv->print_settings = print_settings;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "print-settings");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_print_settings:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns the current print settings.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that the return value is %NULL until either
Packit Service fb6fa5
 * gtk_print_operation_set_print_settings() or
Packit Service fb6fa5
 * gtk_print_operation_run() have been called.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: (transfer none): the current print settings of @op.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkPrintSettings *
Packit Service fb6fa5
gtk_print_operation_get_print_settings (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->print_settings;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_job_name:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @job_name: a string that identifies the print job
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets the name of the print job. The name is used to identify 
Packit Service fb6fa5
 * the job (e.g. in monitoring applications like eggcups). 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If you don't set a job name, GTK+ picks a default one by 
Packit Service fb6fa5
 * numbering successive print jobs.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_job_name (GtkPrintOperation *op,
Packit Service fb6fa5
				  const gchar       *job_name)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
  g_return_if_fail (job_name != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (priv->job_name);
Packit Service fb6fa5
  priv->job_name = g_strdup (job_name);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_notify (G_OBJECT (op), "job-name");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_n_pages:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @n_pages: the number of pages
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets the number of pages in the document. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This <emphasis>must</emphasis> be set to a positive number
Packit Service fb6fa5
 * before the rendering starts. It may be set in a 
Packit Service fb6fa5
 * #GtkPrintOperation::begin-print signal hander.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that the page numbers passed to the 
Packit Service fb6fa5
 * #GtkPrintOperation::request-page-setup 
Packit Service fb6fa5
 * and #GtkPrintOperation::draw-page signals are 0-based, i.e. if 
Packit Service fb6fa5
 * the user chooses to print all pages, the last ::draw-page signal 
Packit Service fb6fa5
 * will be for page @n_pages - 1.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_n_pages (GtkPrintOperation *op,
Packit Service fb6fa5
				 gint               n_pages)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
  g_return_if_fail (n_pages > 0);
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
  g_return_if_fail (priv->current_page == -1 || 
Packit Service fb6fa5
		    priv->current_page < n_pages);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->nr_of_pages != n_pages)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->nr_of_pages = n_pages;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "n-pages");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_current_page:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @current_page: the current page, 0-based
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the current page.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If this is called before gtk_print_operation_run(), 
Packit Service fb6fa5
 * the user will be able to select to print only the current page.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that this only makes sense for pre-paginated documents.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_current_page (GtkPrintOperation *op,
Packit Service fb6fa5
				      gint               current_page)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
  g_return_if_fail (current_page >= 0);
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
  g_return_if_fail (priv->nr_of_pages == -1 || 
Packit Service fb6fa5
		    current_page < priv->nr_of_pages);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->current_page != current_page)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->current_page = current_page;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "current-page");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_use_full_page:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @full_page: %TRUE to set up the #GtkPrintContext for the full page
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If @full_page is %TRUE, the transformation for the cairo context 
Packit Service fb6fa5
 * obtained from #GtkPrintContext puts the origin at the top left 
Packit Service fb6fa5
 * corner of the page (which may not be the top left corner of the 
Packit Service fb6fa5
 * sheet, depending on page orientation and the number of pages per 
Packit Service fb6fa5
 * sheet). Otherwise, the origin is at the top left corner of the
Packit Service fb6fa5
 * imageable area (i.e. inside the margins).
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Since: 2.10 
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_use_full_page (GtkPrintOperation *op,
Packit Service fb6fa5
				       gboolean           full_page)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  full_page = full_page != FALSE;
Packit Service fb6fa5
 
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
	
Packit Service fb6fa5
  if (priv->use_full_page != full_page)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->use_full_page = full_page;
Packit Service fb6fa5
   
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "use-full-page");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_unit:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @unit: the unit to use
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets up the transformation for the cairo context obtained from
Packit Service fb6fa5
 * #GtkPrintContext in such a way that distances are measured in 
Packit Service fb6fa5
 * units of @unit.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_unit (GtkPrintOperation *op,
Packit Service fb6fa5
			      GtkUnit            unit)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->unit != unit)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->unit = unit;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "unit");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_track_print_status:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @track_status: %TRUE to track status after printing
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If track_status is %TRUE, the print operation will try to continue report
Packit Service fb6fa5
 * on the status of the print job in the printer queues and printer. This
Packit Service fb6fa5
 * can allow your application to show things like "out of paper" issues,
Packit Service fb6fa5
 * and when the print job actually reaches the printer.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * This function is often implemented using some form of polling, so it should
Packit Service fb6fa5
 * not be enabled unless needed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_track_print_status (GtkPrintOperation  *op,
Packit Service fb6fa5
					    gboolean            track_status)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->track_print_status != track_status)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->track_print_status = track_status;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "track-print-status");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gtk_print_operation_set_status (GtkPrintOperation *op,
Packit Service fb6fa5
				 GtkPrintStatus     status,
Packit Service fb6fa5
				 const gchar       *string)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
  static const gchar *status_strs[] = {
Packit Service fb6fa5
    NC_("print operation status", "Initial state"),
Packit Service fb6fa5
    NC_("print operation status", "Preparing to print"),
Packit Service fb6fa5
    NC_("print operation status", "Generating data"),
Packit Service fb6fa5
    NC_("print operation status", "Sending data"),
Packit Service fb6fa5
    NC_("print operation status", "Waiting"),
Packit Service fb6fa5
    NC_("print operation status", "Blocking on issue"),
Packit Service fb6fa5
    NC_("print operation status", "Printing"),
Packit Service fb6fa5
    NC_("print operation status", "Finished"),
Packit Service fb6fa5
    NC_("print operation status", "Finished with error")
Packit Service fb6fa5
  };
Packit Service fb6fa5
Packit Service fb6fa5
  if (status < 0 || status > GTK_PRINT_STATUS_FINISHED_ABORTED)
Packit Service fb6fa5
    status = GTK_PRINT_STATUS_FINISHED_ABORTED;
Packit Service fb6fa5
Packit Service fb6fa5
  if (string == NULL)
Packit Service fb6fa5
    string = g_dpgettext2 (GETTEXT_PACKAGE, "print operation status", status_strs[status]);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (priv->status == status &&
Packit Service fb6fa5
      strcmp (string, priv->status_string) == 0)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_free (priv->status_string);
Packit Service fb6fa5
  priv->status_string = g_strdup (string);
Packit Service fb6fa5
  priv->status = status;
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_notify (G_OBJECT (op), "status");
Packit Service fb6fa5
  g_object_notify (G_OBJECT (op), "status-string");
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (op, signals[STATUS_CHANGED], 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_status:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns the status of the print operation. 
Packit Service fb6fa5
 * Also see gtk_print_operation_get_status_string().
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the status of the print operation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkPrintStatus
Packit Service fb6fa5
gtk_print_operation_get_status (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), 
Packit Service fb6fa5
                        GTK_PRINT_STATUS_FINISHED_ABORTED);
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->status;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_status_string:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns a string representation of the status of the 
Packit Service fb6fa5
 * print operation. The string is translated and suitable
Packit Service fb6fa5
 * for displaying the print status e.g. in a #GtkStatusbar.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Use gtk_print_operation_get_status() to obtain a status
Packit Service fb6fa5
 * value that is suitable for programmatic use. 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: a string representation of the status
Packit Service fb6fa5
 *    of the print operation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
const gchar *
Packit Service fb6fa5
gtk_print_operation_get_status_string (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), "");
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->status_string;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_is_finished:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * A convenience function to find out if the print operation
Packit Service fb6fa5
 * is finished, either successfully (%GTK_PRINT_STATUS_FINISHED)
Packit Service fb6fa5
 * or unsuccessfully (%GTK_PRINT_STATUS_FINISHED_ABORTED).
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Note: when you enable print status tracking the print operation
Packit Service fb6fa5
 * can be in a non-finished state even after done has been called, as
Packit Service fb6fa5
 * the operation status then tracks the print job status on the printer.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE, if the print operation is finished.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_print_operation_is_finished (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
  return
Packit Service fb6fa5
    priv->status == GTK_PRINT_STATUS_FINISHED_ABORTED ||
Packit Service fb6fa5
    priv->status == GTK_PRINT_STATUS_FINISHED;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_show_progress:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @show_progress: %TRUE to show a progress dialog
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * If @show_progress is %TRUE, the print operation will show a 
Packit Service fb6fa5
 * progress dialog during the print operation.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_show_progress (GtkPrintOperation  *op,
Packit Service fb6fa5
				       gboolean            show_progress)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  show_progress = show_progress != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->show_progress != show_progress)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->show_progress = show_progress;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "show-progress");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_allow_async:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @allow_async: %TRUE to allow asynchronous operation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets whether the gtk_print_operation_run() may return
Packit Service fb6fa5
 * before the print operation is completed. Note that
Packit Service fb6fa5
 * some platforms may not allow asynchronous operation.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_allow_async (GtkPrintOperation  *op,
Packit Service fb6fa5
				     gboolean            allow_async)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  allow_async = allow_async != FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->allow_async != allow_async)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->allow_async = allow_async;
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "allow-async");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_custom_tab_label:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @label: (allow-none): the label to use, or %NULL to use the default label
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the label for the tab holding custom widgets.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_custom_tab_label (GtkPrintOperation  *op,
Packit Service fb6fa5
					  const gchar        *label)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (priv->custom_tab_label);
Packit Service fb6fa5
  priv->custom_tab_label = g_strdup (label);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_notify (G_OBJECT (op), "custom-tab-label");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_export_filename:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @filename: the filename for the exported file
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets up the #GtkPrintOperation to generate a file instead
Packit Service fb6fa5
 * of showing the print dialog. The indended use of this function
Packit Service fb6fa5
 * is for implementing "Export to PDF" actions. Currently, PDF
Packit Service fb6fa5
 * is the only supported format.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * "Print to PDF" support is independent of this and is done
Packit Service fb6fa5
 * by letting the user pick the "Print to PDF" item from the list
Packit Service fb6fa5
 * of printers in the print dialog.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_export_filename (GtkPrintOperation *op,
Packit Service fb6fa5
					 const gchar       *filename)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (priv->export_filename);
Packit Service fb6fa5
  priv->export_filename = g_strdup (filename);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_notify (G_OBJECT (op), "export-filename");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Creates the initial page setup used for printing unless the
Packit Service fb6fa5
 * app overrides this on a per-page basis using request_page_setup.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Data is taken from, in order, if existing:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * PrintSettings returned from the print dialog
Packit Service fb6fa5
 *  (initial dialog values are set from default_page_setup
Packit Service fb6fa5
 *   if unset in app specified print_settings)
Packit Service fb6fa5
 * default_page_setup
Packit Service fb6fa5
 * per-locale default setup
Packit Service fb6fa5
 */
Packit Service fb6fa5
static GtkPageSetup *
Packit Service fb6fa5
create_page_setup (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
  GtkPageSetup *page_setup;
Packit Service fb6fa5
  GtkPrintSettings *settings;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (priv->default_page_setup)
Packit Service fb6fa5
    page_setup = gtk_page_setup_copy (priv->default_page_setup);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    page_setup = gtk_page_setup_new ();
Packit Service fb6fa5
Packit Service fb6fa5
  settings = priv->print_settings;
Packit Service fb6fa5
  if (settings)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkPaperSize *paper_size;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (gtk_print_settings_has_key (settings, GTK_PRINT_SETTINGS_ORIENTATION))
Packit Service fb6fa5
	gtk_page_setup_set_orientation (page_setup,
Packit Service fb6fa5
					gtk_print_settings_get_orientation (settings));
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
      paper_size = gtk_print_settings_get_paper_size (settings);
Packit Service fb6fa5
      if (paper_size)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gtk_page_setup_set_paper_size (page_setup, paper_size);
Packit Service fb6fa5
	  gtk_paper_size_free (paper_size);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      /* TODO: Margins? */
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return page_setup;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void 
Packit Service fb6fa5
pdf_start_page (GtkPrintOperation *op,
Packit Service fb6fa5
		GtkPrintContext   *print_context,
Packit Service fb6fa5
		GtkPageSetup      *page_setup)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPaperSize *paper_size;
Packit Service fb6fa5
  cairo_surface_t *surface = op->priv->platform_data;
Packit Service fb6fa5
  gdouble w, h;
Packit Service fb6fa5
Packit Service fb6fa5
  paper_size = gtk_page_setup_get_paper_size (page_setup);
Packit Service fb6fa5
Packit Service fb6fa5
  w = gtk_paper_size_get_width (paper_size, GTK_UNIT_POINTS);
Packit Service fb6fa5
  h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
Packit Service fb6fa5
  
Packit Service fb6fa5
  cairo_pdf_surface_set_size (surface, w, h);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
pdf_end_page (GtkPrintOperation *op,
Packit Service fb6fa5
	      GtkPrintContext   *print_context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  cairo_t *cr;
Packit Service fb6fa5
Packit Service fb6fa5
  cr = gtk_print_context_get_cairo_context (print_context);
Packit Service fb6fa5
Packit Service fb6fa5
  if ((op->priv->manual_number_up < 2) ||
Packit Service fb6fa5
      ((op->priv->page_position + 1) % op->priv->manual_number_up == 0) ||
Packit Service fb6fa5
      (op->priv->page_position == op->priv->nr_of_pages_to_print - 1))
Packit Service fb6fa5
    cairo_show_page (cr);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
pdf_end_run (GtkPrintOperation *op,
Packit Service fb6fa5
	     gboolean           wait,
Packit Service fb6fa5
	     gboolean           cancelled)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
  cairo_surface_t *surface = priv->platform_data;
Packit Service fb6fa5
Packit Service fb6fa5
  cairo_surface_finish (surface);
Packit Service fb6fa5
  cairo_surface_destroy (surface);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->platform_data = NULL;
Packit Service fb6fa5
  priv->free_platform_data = NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkPrintOperationResult
Packit Service fb6fa5
run_pdf (GtkPrintOperation  *op,
Packit Service fb6fa5
	 GtkWindow          *parent,
Packit Service fb6fa5
	 gboolean           *do_print)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
  GtkPageSetup *page_setup;
Packit Service fb6fa5
  cairo_surface_t *surface;
Packit Service fb6fa5
  cairo_t *cr;
Packit Service fb6fa5
  gdouble width, height;
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv->print_context = _gtk_print_context_new (op);
Packit Service fb6fa5
  
Packit Service fb6fa5
  page_setup = create_page_setup (op);
Packit Service fb6fa5
  _gtk_print_context_set_page_setup (priv->print_context, page_setup);
Packit Service fb6fa5
Packit Service fb6fa5
  /* This will be overwritten later by the non-default size, but
Packit Service fb6fa5
     we need to pass some size: */
Packit Service fb6fa5
  width = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
  height = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
  g_object_unref (page_setup);
Packit Service fb6fa5
  
Packit Service fb6fa5
  surface = cairo_pdf_surface_create (priv->export_filename,
Packit Service fb6fa5
				      width, height);
Packit Service fb6fa5
  if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_set_error_literal (&priv->error,
Packit Service fb6fa5
                           GTK_PRINT_ERROR,
Packit Service fb6fa5
                           GTK_PRINT_ERROR_GENERAL,
Packit Service fb6fa5
                           cairo_status_to_string (cairo_surface_status (surface)));
Packit Service fb6fa5
      *do_print = FALSE;
Packit Service fb6fa5
      return GTK_PRINT_OPERATION_RESULT_ERROR;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* this would crash on a nil surface */
Packit Service fb6fa5
  cairo_surface_set_fallback_resolution (surface, 300, 300);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->platform_data = surface;
Packit Service fb6fa5
  priv->free_platform_data = (GDestroyNotify) cairo_surface_destroy;
Packit Service fb6fa5
Packit Service fb6fa5
  cr = cairo_create (surface);
Packit Service fb6fa5
  gtk_print_context_set_cairo_context (op->priv->print_context,
Packit Service fb6fa5
				       cr, 72, 72);
Packit Service fb6fa5
  cairo_destroy (cr);
Packit Service fb6fa5
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv->print_pages = GTK_PRINT_PAGES_ALL;
Packit Service fb6fa5
  priv->page_ranges = NULL;
Packit Service fb6fa5
  priv->num_page_ranges = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  priv->manual_num_copies = 1;
Packit Service fb6fa5
  priv->manual_collation = FALSE;
Packit Service fb6fa5
  priv->manual_reverse = FALSE;
Packit Service fb6fa5
  priv->manual_page_set = GTK_PAGE_SET_ALL;
Packit Service fb6fa5
  priv->manual_scale = 1.0;
Packit Service fb6fa5
  priv->manual_orientation = TRUE;
Packit Service fb6fa5
  priv->manual_number_up = 1;
Packit Service fb6fa5
  priv->manual_number_up_layout = GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM;
Packit Service fb6fa5
  
Packit Service fb6fa5
  *do_print = TRUE;
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv->start_page = pdf_start_page;
Packit Service fb6fa5
  priv->end_page = pdf_end_page;
Packit Service fb6fa5
  priv->end_run = pdf_end_run;
Packit Service fb6fa5
  
Packit Service fb6fa5
  return GTK_PRINT_OPERATION_RESULT_APPLY; 
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
clamp_page_ranges (PrintPagesData *data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv; 
Packit Service fb6fa5
  gint                      num_of_correct_ranges;
Packit Service fb6fa5
  gint                      i;
Packit Service fb6fa5
Packit Service fb6fa5
  priv = data->op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  num_of_correct_ranges = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < data->num_ranges; i++)
Packit Service fb6fa5
    if ((data->ranges[i].start >= 0) &&
Packit Service fb6fa5
        (data->ranges[i].start < priv->nr_of_pages) &&
Packit Service fb6fa5
        (data->ranges[i].end >= 0) &&
Packit Service fb6fa5
        (data->ranges[i].end < priv->nr_of_pages))
Packit Service fb6fa5
      {
Packit Service fb6fa5
        data->ranges[num_of_correct_ranges] = data->ranges[i];
Packit Service fb6fa5
        num_of_correct_ranges++;
Packit Service fb6fa5
      }
Packit Service fb6fa5
    else if ((data->ranges[i].start >= 0) &&
Packit Service fb6fa5
             (data->ranges[i].start < priv->nr_of_pages) &&
Packit Service fb6fa5
             (data->ranges[i].end >= priv->nr_of_pages))
Packit Service fb6fa5
      {
Packit Service fb6fa5
        data->ranges[i].end = priv->nr_of_pages - 1;
Packit Service fb6fa5
        data->ranges[num_of_correct_ranges] = data->ranges[i];
Packit Service fb6fa5
        num_of_correct_ranges++;
Packit Service fb6fa5
      }
Packit Service fb6fa5
    else if ((data->ranges[i].end >= 0) &&
Packit Service fb6fa5
             (data->ranges[i].end < priv->nr_of_pages) &&
Packit Service fb6fa5
             (data->ranges[i].start < 0))
Packit Service fb6fa5
      {
Packit Service fb6fa5
        data->ranges[i].start = 0;
Packit Service fb6fa5
        data->ranges[num_of_correct_ranges] = data->ranges[i];
Packit Service fb6fa5
        num_of_correct_ranges++;
Packit Service fb6fa5
      }
Packit Service fb6fa5
Packit Service fb6fa5
  data->num_ranges = num_of_correct_ranges;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
increment_page_sequence (PrintPagesData *data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = data->op->priv;
Packit Service fb6fa5
  gint inc;
Packit Service fb6fa5
Packit Service fb6fa5
  if (data->total == -1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data->total = 0;
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* check whether we reached last position */
Packit Service fb6fa5
  if (priv->page_position == data->last_position &&
Packit Service fb6fa5
      !(data->collated_copies > 1 && data->collated < (data->collated_copies - 1)))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (data->uncollated_copies > 1 && data->uncollated < (data->uncollated_copies - 1))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          priv->page_position = data->first_position;
Packit Service fb6fa5
          data->sheet = data->first_sheet;
Packit Service fb6fa5
          data->uncollated++;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          data->done = TRUE;
Packit Service fb6fa5
	  return;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (priv->manual_reverse)
Packit Service fb6fa5
        inc = -1;
Packit Service fb6fa5
      else
Packit Service fb6fa5
        inc = 1;
Packit Service fb6fa5
Packit Service fb6fa5
      /* changing sheet */
Packit Service fb6fa5
      if (priv->manual_number_up < 2 ||
Packit Service fb6fa5
          (priv->page_position + 1) % priv->manual_number_up == 0 ||
Packit Service fb6fa5
          priv->page_position == data->last_position ||
Packit Service fb6fa5
          priv->page_position == priv->nr_of_pages_to_print - 1)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          /* check whether to print the same sheet again */
Packit Service fb6fa5
          if (data->collated_copies > 1)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              if (data->collated < (data->collated_copies - 1))
Packit Service fb6fa5
                {
Packit Service fb6fa5
                  data->collated++;
Packit Service fb6fa5
                  data->total++;
Packit Service fb6fa5
                  priv->page_position = data->sheet * priv->manual_number_up;
Packit Service fb6fa5
Packit Service fb6fa5
                  if (priv->page_position < 0 ||
Packit Service fb6fa5
                      priv->page_position >= priv->nr_of_pages_to_print ||
Packit Service fb6fa5
                      data->sheet < 0 ||
Packit Service fb6fa5
                      data->sheet >= data->num_of_sheets)
Packit Service fb6fa5
		    {
Packit Service fb6fa5
                      data->done = TRUE;
Packit Service fb6fa5
		      return;
Packit Service fb6fa5
		    }
Packit Service fb6fa5
                  else
Packit Service fb6fa5
                    data->page = data->pages[priv->page_position];
Packit Service fb6fa5
Packit Service fb6fa5
                  return;
Packit Service fb6fa5
                }
Packit Service fb6fa5
              else
Packit Service fb6fa5
                data->collated = 0;
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          if (priv->manual_page_set == GTK_PAGE_SET_ODD ||
Packit Service fb6fa5
              priv->manual_page_set == GTK_PAGE_SET_EVEN)
Packit Service fb6fa5
            data->sheet += 2 * inc;
Packit Service fb6fa5
          else
Packit Service fb6fa5
            data->sheet += inc;
Packit Service fb6fa5
Packit Service fb6fa5
          priv->page_position = data->sheet * priv->manual_number_up;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        priv->page_position += 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* general check */
Packit Service fb6fa5
  if (priv->page_position < 0 ||
Packit Service fb6fa5
      priv->page_position >= priv->nr_of_pages_to_print ||
Packit Service fb6fa5
      data->sheet < 0 ||
Packit Service fb6fa5
      data->sheet >= data->num_of_sheets)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data->done = TRUE;
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    data->page = data->pages[priv->page_position];
Packit Service fb6fa5
Packit Service fb6fa5
  data->total++;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
print_pages_idle_done (gpointer user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PrintPagesData *data;
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  data = (PrintPagesData*)user_data;
Packit Service fb6fa5
  priv = data->op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  priv->print_pages_idle_id = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->show_progress_timeout_id > 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_source_remove (priv->show_progress_timeout_id);
Packit Service fb6fa5
      priv->show_progress_timeout_id = 0;
Packit Service fb6fa5
    }
Packit Service fb6fa5
 
Packit Service fb6fa5
  if (data->progress)
Packit Service fb6fa5
    gtk_widget_destroy (data->progress);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->rloop && !data->is_preview) 
Packit Service fb6fa5
    g_main_loop_quit (priv->rloop);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!data->is_preview)
Packit Service fb6fa5
    g_signal_emit (data->op, signals[DONE], 0,
Packit Service fb6fa5
		   priv->cancelled ?
Packit Service fb6fa5
		   GTK_PRINT_OPERATION_RESULT_CANCEL :
Packit Service fb6fa5
		   GTK_PRINT_OPERATION_RESULT_APPLY);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_object_unref (data->op);
Packit Service fb6fa5
  g_free (data->pages);
Packit Service fb6fa5
  g_free (data);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
update_progress (PrintPagesData *data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv; 
Packit Service fb6fa5
  gchar *text = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv = data->op->priv;
Packit Service fb6fa5
 
Packit Service fb6fa5
  if (data->progress)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (priv->status == GTK_PRINT_STATUS_PREPARING)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if (priv->nr_of_pages_to_print > 0)
Packit Service fb6fa5
	    text = g_strdup_printf (_("Preparing %d"), priv->nr_of_pages_to_print);
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    text = g_strdup (_("Preparing"));
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else if (priv->status == GTK_PRINT_STATUS_GENERATING_DATA)
Packit Service fb6fa5
	text = g_strdup_printf (_("Printing %d"), data->total);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (text)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  g_object_set (data->progress, "text", text, NULL);
Packit Service fb6fa5
	  g_free (text);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
 }
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_defer_drawing:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sets up the #GtkPrintOperation to wait for calling of
Packit Service fb6fa5
 * gtk_print_operation_draw_page_finish() from application. It can
Packit Service fb6fa5
 * be used for drawing page in another thread.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function must be called in the callback of "draw-page" signal.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.16
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_defer_drawing (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_DRAWING);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->page_drawing_state = GTK_PAGE_DRAWING_STATE_DEFERRED_DRAWING;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_embed_page_setup:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @embed: %TRUE to embed page setup selection in the #GtkPrintDialog
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Embed page size combo box and orientation combo box into page setup page.
Packit Service fb6fa5
 * Selected page setup is stored as default page setup in #GtkPrintOperation.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.18
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_embed_page_setup (GtkPrintOperation  *op,
Packit Service fb6fa5
                                          gboolean            embed)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  embed = embed != FALSE;
Packit Service fb6fa5
  if (priv->embed_page_setup != embed)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->embed_page_setup = embed;
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "embed-page-setup");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_embed_page_setup:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the value of #GtkPrintOperation::embed-page-setup property.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns: whether page setup selection combos are embedded
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.18
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_print_operation_get_embed_page_setup (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->embed_page_setup;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_draw_page_finish:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Signalize that drawing of particular page is complete.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * It is called after completion of page drawing (e.g. drawing in another
Packit Service fb6fa5
 * thread).
Packit Service fb6fa5
 * If gtk_print_operation_set_defer_drawing() was called before, then this function
Packit Service fb6fa5
 * has to be called by application. In another case it is called by the library
Packit Service fb6fa5
 * itself.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.16
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_draw_page_finish (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
  GtkPageSetup *page_setup;
Packit Service fb6fa5
  GtkPrintContext *print_context;
Packit Service fb6fa5
  cairo_t *cr;
Packit Service fb6fa5
  
Packit Service fb6fa5
  print_context = priv->print_context;
Packit Service fb6fa5
  page_setup = gtk_print_context_get_page_setup (print_context);
Packit Service fb6fa5
Packit Service fb6fa5
  cr = gtk_print_context_get_cairo_context (print_context);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->end_page (op, print_context);
Packit Service fb6fa5
  
Packit Service fb6fa5
  cairo_restore (cr);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (page_setup);
Packit Service fb6fa5
Packit Service fb6fa5
  priv->page_drawing_state = GTK_PAGE_DRAWING_STATE_READY;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
common_render_page (GtkPrintOperation *op,
Packit Service fb6fa5
		    gint               page_nr)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
  GtkPageSetup *page_setup;
Packit Service fb6fa5
  GtkPrintContext *print_context;
Packit Service fb6fa5
  cairo_t *cr;
Packit Service fb6fa5
Packit Service fb6fa5
  print_context = priv->print_context;
Packit Service fb6fa5
  
Packit Service fb6fa5
  page_setup = create_page_setup (op);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_signal_emit (op, signals[REQUEST_PAGE_SETUP], 0, 
Packit Service fb6fa5
		 print_context, page_nr, page_setup);
Packit Service fb6fa5
  
Packit Service fb6fa5
  _gtk_print_context_set_page_setup (print_context, page_setup);
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv->start_page (op, print_context, page_setup);
Packit Service fb6fa5
  
Packit Service fb6fa5
  cr = gtk_print_context_get_cairo_context (print_context);
Packit Service fb6fa5
  
Packit Service fb6fa5
  cairo_save (cr);
Packit Service fb6fa5
  if (priv->manual_scale != 1.0 && priv->manual_number_up <= 1)
Packit Service fb6fa5
    cairo_scale (cr,
Packit Service fb6fa5
		 priv->manual_scale,
Packit Service fb6fa5
		 priv->manual_scale);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (priv->manual_orientation)
Packit Service fb6fa5
    _gtk_print_context_rotate_according_to_orientation (print_context);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->manual_number_up > 1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkPageOrientation  orientation;
Packit Service fb6fa5
      GtkPageSetup       *page_setup;
Packit Service fb6fa5
      gdouble             paper_width, paper_height;
Packit Service fb6fa5
      gdouble             page_width, page_height;
Packit Service fb6fa5
      gdouble             context_width, context_height;
Packit Service fb6fa5
      gdouble             bottom_margin, top_margin, left_margin, right_margin;
Packit Service fb6fa5
      gdouble             x_step, y_step;
Packit Service fb6fa5
      gdouble             x_scale, y_scale, scale;
Packit Service fb6fa5
      gdouble             horizontal_offset = 0.0, vertical_offset = 0.0;
Packit Service fb6fa5
      gint                columns, rows, x, y, tmp_length;
Packit Service fb6fa5
Packit Service fb6fa5
      page_setup = gtk_print_context_get_page_setup (print_context);
Packit Service fb6fa5
      orientation = gtk_page_setup_get_orientation (page_setup);
Packit Service fb6fa5
Packit Service fb6fa5
      top_margin = gtk_page_setup_get_top_margin (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
      bottom_margin = gtk_page_setup_get_bottom_margin (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
      left_margin = gtk_page_setup_get_left_margin (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
      right_margin = gtk_page_setup_get_right_margin (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
Packit Service fb6fa5
      paper_width = gtk_page_setup_get_paper_width (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
      paper_height = gtk_page_setup_get_paper_height (page_setup, GTK_UNIT_POINTS);
Packit Service fb6fa5
Packit Service fb6fa5
      context_width = gtk_print_context_get_width (print_context);
Packit Service fb6fa5
      context_height = gtk_print_context_get_height (print_context);
Packit Service fb6fa5
Packit Service fb6fa5
      if (orientation == GTK_PAGE_ORIENTATION_PORTRAIT ||
Packit Service fb6fa5
          orientation == GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          page_width = paper_width - (left_margin + right_margin);
Packit Service fb6fa5
          page_height = paper_height - (top_margin + bottom_margin);
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        {
Packit Service fb6fa5
          page_width = paper_width - (top_margin + bottom_margin);
Packit Service fb6fa5
          page_height = paper_height - (left_margin + right_margin);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (orientation == GTK_PAGE_ORIENTATION_PORTRAIT ||
Packit Service fb6fa5
          orientation == GTK_PAGE_ORIENTATION_REVERSE_PORTRAIT)
Packit Service fb6fa5
        cairo_translate (cr, left_margin, top_margin);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        cairo_translate (cr, top_margin, left_margin);
Packit Service fb6fa5
Packit Service fb6fa5
      switch (priv->manual_number_up)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          default:
Packit Service fb6fa5
            columns = 1;
Packit Service fb6fa5
            rows = 1;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case 2:
Packit Service fb6fa5
            columns = 2;
Packit Service fb6fa5
            rows = 1;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case 4:
Packit Service fb6fa5
            columns = 2;
Packit Service fb6fa5
            rows = 2;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case 6:
Packit Service fb6fa5
            columns = 3;
Packit Service fb6fa5
            rows = 2;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case 9:
Packit Service fb6fa5
            columns = 3;
Packit Service fb6fa5
            rows = 3;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case 16:
Packit Service fb6fa5
            columns = 4;
Packit Service fb6fa5
            rows = 4;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (orientation == GTK_PAGE_ORIENTATION_LANDSCAPE ||
Packit Service fb6fa5
          orientation == GTK_PAGE_ORIENTATION_REVERSE_LANDSCAPE)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          tmp_length = columns;
Packit Service fb6fa5
          columns = rows;
Packit Service fb6fa5
          rows = tmp_length;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      switch (priv->manual_number_up_layout)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_TOP_TO_BOTTOM:
Packit Service fb6fa5
            x = priv->page_position % columns;
Packit Service fb6fa5
            y = (priv->page_position / columns) % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_LEFT_TO_RIGHT_BOTTOM_TO_TOP:
Packit Service fb6fa5
            x = priv->page_position % columns;
Packit Service fb6fa5
            y = rows - 1 - (priv->page_position / columns) % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_TOP_TO_BOTTOM:
Packit Service fb6fa5
            x = columns - 1 - priv->page_position % columns;
Packit Service fb6fa5
            y = (priv->page_position / columns) % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_RIGHT_TO_LEFT_BOTTOM_TO_TOP:
Packit Service fb6fa5
            x = columns - 1 - priv->page_position % columns;
Packit Service fb6fa5
            y = rows - 1 - (priv->page_position / columns) % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_LEFT_TO_RIGHT:
Packit Service fb6fa5
            x = (priv->page_position / rows) % columns;
Packit Service fb6fa5
            y = priv->page_position % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_TOP_TO_BOTTOM_RIGHT_TO_LEFT:
Packit Service fb6fa5
            x = columns - 1 - (priv->page_position / rows) % columns;
Packit Service fb6fa5
            y = priv->page_position % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_LEFT_TO_RIGHT:
Packit Service fb6fa5
            x = (priv->page_position / rows) % columns;
Packit Service fb6fa5
            y = rows - 1 - priv->page_position % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          case GTK_NUMBER_UP_LAYOUT_BOTTOM_TO_TOP_RIGHT_TO_LEFT:
Packit Service fb6fa5
            x = columns - 1 - (priv->page_position / rows) % columns;
Packit Service fb6fa5
            y = rows - 1 - priv->page_position % rows;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          default:
Packit Service fb6fa5
            g_assert_not_reached();
Packit Service fb6fa5
            x = 0;
Packit Service fb6fa5
            y = 0;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->manual_number_up == 4 || priv->manual_number_up == 9 || priv->manual_number_up == 16)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          x_scale = page_width / (columns * paper_width);
Packit Service fb6fa5
          y_scale = page_height / (rows * paper_height);
Packit Service fb6fa5
Packit Service fb6fa5
          scale = x_scale < y_scale ? x_scale : y_scale;
Packit Service fb6fa5
Packit Service fb6fa5
          x_step = paper_width * (x_scale / scale);
Packit Service fb6fa5
          y_step = paper_height * (y_scale / scale);
Packit Service fb6fa5
Packit Service fb6fa5
          if ((left_margin + right_margin) > 0)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              horizontal_offset = left_margin * (x_step - context_width) / (left_margin + right_margin);
Packit Service fb6fa5
              vertical_offset = top_margin * (y_step - context_height) / (top_margin + bottom_margin);
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            {
Packit Service fb6fa5
              horizontal_offset = (x_step - context_width) / 2.0;
Packit Service fb6fa5
              vertical_offset = (y_step - context_height) / 2.0;
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          cairo_scale (cr, scale, scale);
Packit Service fb6fa5
Packit Service fb6fa5
          cairo_translate (cr,
Packit Service fb6fa5
                           x * x_step + horizontal_offset,
Packit Service fb6fa5
                           y * y_step + vertical_offset);
Packit Service fb6fa5
Packit Service fb6fa5
          if (priv->manual_scale != 1.0)
Packit Service fb6fa5
            cairo_scale (cr, priv->manual_scale, priv->manual_scale);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->manual_number_up == 2 || priv->manual_number_up == 6)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          x_scale = page_height / (columns * paper_width);
Packit Service fb6fa5
          y_scale = page_width / (rows * paper_height);
Packit Service fb6fa5
Packit Service fb6fa5
          scale = x_scale < y_scale ? x_scale : y_scale;
Packit Service fb6fa5
Packit Service fb6fa5
          horizontal_offset = (paper_width * (x_scale / scale) - paper_width) / 2.0 * columns;
Packit Service fb6fa5
          vertical_offset = (paper_height * (y_scale / scale) - paper_height) / 2.0 * rows;
Packit Service fb6fa5
Packit Service fb6fa5
          if (!priv->use_full_page)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              horizontal_offset -= right_margin;
Packit Service fb6fa5
              vertical_offset += top_margin;
Packit Service fb6fa5
            }
Packit Service fb6fa5
Packit Service fb6fa5
          cairo_scale (cr, scale, scale);
Packit Service fb6fa5
Packit Service fb6fa5
          cairo_translate (cr,
Packit Service fb6fa5
                           y * paper_height + vertical_offset,
Packit Service fb6fa5
                           (columns - x) * paper_width + horizontal_offset);
Packit Service fb6fa5
Packit Service fb6fa5
          if (priv->manual_scale != 1.0)
Packit Service fb6fa5
            cairo_scale (cr, priv->manual_scale, priv->manual_scale);
Packit Service fb6fa5
Packit Service fb6fa5
          cairo_rotate (cr, - G_PI / 2);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    if (!priv->use_full_page)
Packit Service fb6fa5
      _gtk_print_context_translate_into_margin (print_context);
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv->page_drawing_state = GTK_PAGE_DRAWING_STATE_DRAWING;
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (op, signals[DRAW_PAGE], 0, 
Packit Service fb6fa5
		 print_context, page_nr);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_DRAWING)
Packit Service fb6fa5
    gtk_print_operation_draw_page_finish (op);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
prepare_data (PrintPagesData *data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
  GtkPageSetup             *page_setup;
Packit Service fb6fa5
  gboolean                  paginated = FALSE;
Packit Service fb6fa5
  gint                      i, j, counter;
Packit Service fb6fa5
Packit Service fb6fa5
  priv = data->op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->manual_collation)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data->uncollated_copies = priv->manual_num_copies;
Packit Service fb6fa5
      data->collated_copies = 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data->uncollated_copies = 1;
Packit Service fb6fa5
      data->collated_copies = priv->manual_num_copies;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!data->initialized)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data->initialized = TRUE;
Packit Service fb6fa5
      page_setup = create_page_setup (data->op);
Packit Service fb6fa5
      _gtk_print_context_set_page_setup (priv->print_context,
Packit Service fb6fa5
                                         page_setup);
Packit Service fb6fa5
      g_object_unref (page_setup);
Packit Service fb6fa5
Packit Service fb6fa5
      g_signal_emit (data->op, signals[BEGIN_PRINT], 0, priv->print_context);
Packit Service fb6fa5
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_emit (data->op, signals[PAGINATE], 0, priv->print_context, &paginated);
Packit Service fb6fa5
  if (!paginated)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Initialize parts of PrintPagesData that depend on nr_of_pages
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (priv->print_pages == GTK_PRINT_PAGES_RANGES)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (priv->page_ranges == NULL) 
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_warning ("no pages to print");
Packit Service fb6fa5
          priv->cancelled = TRUE;
Packit Service fb6fa5
          return;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      data->ranges = priv->page_ranges;
Packit Service fb6fa5
      data->num_ranges = priv->num_page_ranges;
Packit Service fb6fa5
      for (i = 0; i < data->num_ranges; i++)
Packit Service fb6fa5
        if (data->ranges[i].end == -1 || 
Packit Service fb6fa5
            data->ranges[i].end >= priv->nr_of_pages)
Packit Service fb6fa5
          data->ranges[i].end = priv->nr_of_pages - 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (priv->print_pages == GTK_PRINT_PAGES_CURRENT &&
Packit Service fb6fa5
   priv->current_page != -1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data->ranges = &data->one_range;
Packit Service fb6fa5
      data->num_ranges = 1;
Packit Service fb6fa5
      data->ranges[0].start = priv->current_page;
Packit Service fb6fa5
      data->ranges[0].end = priv->current_page;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      data->ranges = &data->one_range;
Packit Service fb6fa5
      data->num_ranges = 1;
Packit Service fb6fa5
      data->ranges[0].start = 0;
Packit Service fb6fa5
      data->ranges[0].end = priv->nr_of_pages - 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  clamp_page_ranges (data);
Packit Service fb6fa5
Packit Service fb6fa5
  if (data->num_ranges < 1) 
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->cancelled = TRUE;
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  priv->nr_of_pages_to_print = 0;
Packit Service fb6fa5
  for (i = 0; i < data->num_ranges; i++)
Packit Service fb6fa5
    priv->nr_of_pages_to_print += data->ranges[i].end - data->ranges[i].start + 1;
Packit Service fb6fa5
Packit Service fb6fa5
  data->pages = g_new (gint, priv->nr_of_pages_to_print);
Packit Service fb6fa5
  counter = 0;
Packit Service fb6fa5
  for (i = 0; i < data->num_ranges; i++)
Packit Service fb6fa5
    for (j = data->ranges[i].start; j <= data->ranges[i].end; j++)
Packit Service fb6fa5
      {
Packit Service fb6fa5
        data->pages[counter] = j;
Packit Service fb6fa5
        counter++;
Packit Service fb6fa5
      }
Packit Service fb6fa5
Packit Service fb6fa5
  data->total = -1;
Packit Service fb6fa5
  data->collated = 0;
Packit Service fb6fa5
  data->uncollated = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->manual_number_up > 1)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (priv->nr_of_pages_to_print % priv->manual_number_up == 0)
Packit Service fb6fa5
        data->num_of_sheets = priv->nr_of_pages_to_print / priv->manual_number_up;
Packit Service fb6fa5
      else
Packit Service fb6fa5
        data->num_of_sheets = priv->nr_of_pages_to_print / priv->manual_number_up + 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    data->num_of_sheets = priv->nr_of_pages_to_print;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->manual_reverse)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* data->sheet is 0-based */
Packit Service fb6fa5
      if (priv->manual_page_set == GTK_PAGE_SET_ODD)
Packit Service fb6fa5
        data->sheet = (data->num_of_sheets - 1) - (data->num_of_sheets - 1) % 2;
Packit Service fb6fa5
      else if (priv->manual_page_set == GTK_PAGE_SET_EVEN)
Packit Service fb6fa5
        data->sheet = (data->num_of_sheets - 1) - (1 - (data->num_of_sheets - 1) % 2);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        data->sheet = data->num_of_sheets - 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* data->sheet is 0-based */
Packit Service fb6fa5
      if (priv->manual_page_set == GTK_PAGE_SET_ODD)
Packit Service fb6fa5
        data->sheet = 0;
Packit Service fb6fa5
      else if (priv->manual_page_set == GTK_PAGE_SET_EVEN)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (data->num_of_sheets > 1)
Packit Service fb6fa5
            data->sheet = 1;
Packit Service fb6fa5
          else
Packit Service fb6fa5
            data->sheet = -1;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      else
Packit Service fb6fa5
        data->sheet = 0;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  priv->page_position = data->sheet * priv->manual_number_up;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->page_position < 0 || priv->page_position >= priv->nr_of_pages_to_print)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->cancelled = TRUE;
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  data->page = data->pages[priv->page_position];
Packit Service fb6fa5
  data->first_position = priv->page_position;
Packit Service fb6fa5
  data->first_sheet = data->sheet;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->manual_reverse)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (priv->manual_page_set == GTK_PAGE_SET_ODD)
Packit Service fb6fa5
        data->last_position = MIN (priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1);
Packit Service fb6fa5
      else if (priv->manual_page_set == GTK_PAGE_SET_EVEN)
Packit Service fb6fa5
        data->last_position = MIN (2 * priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        data->last_position = MIN (priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (priv->manual_page_set == GTK_PAGE_SET_ODD)
Packit Service fb6fa5
        data->last_position = MIN (((data->num_of_sheets - 1) - ((data->num_of_sheets - 1) % 2)) * priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1);
Packit Service fb6fa5
      else if (priv->manual_page_set == GTK_PAGE_SET_EVEN)
Packit Service fb6fa5
        data->last_position = MIN (((data->num_of_sheets - 1) - (1 - (data->num_of_sheets - 1) % 2)) * priv->manual_number_up - 1, priv->nr_of_pages_to_print - 1);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        data->last_position = priv->nr_of_pages_to_print - 1;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  _gtk_print_operation_set_status (data->op, 
Packit Service fb6fa5
                                   GTK_PRINT_STATUS_GENERATING_DATA, 
Packit Service fb6fa5
                                   NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
print_pages_idle (gpointer user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  PrintPagesData *data; 
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
  gboolean done = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  data = (PrintPagesData*)user_data;
Packit Service fb6fa5
  priv = data->op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_READY)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (priv->status == GTK_PRINT_STATUS_PREPARING)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          prepare_data (data);
Packit Service fb6fa5
          goto out;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (data->is_preview && !priv->cancelled)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          done = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
          g_signal_emit_by_name (data->op, "ready", priv->print_context);
Packit Service fb6fa5
          goto out;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      increment_page_sequence (data);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!data->done)
Packit Service fb6fa5
        common_render_page (data->op, data->page);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        done = priv->page_drawing_state == GTK_PAGE_DRAWING_STATE_READY;
Packit Service fb6fa5
Packit Service fb6fa5
 out:
Packit Service fb6fa5
Packit Service fb6fa5
      if (priv->cancelled)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          _gtk_print_operation_set_status (data->op, GTK_PRINT_STATUS_FINISHED_ABORTED, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
          data->is_preview = FALSE;
Packit Service fb6fa5
          done = TRUE;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (done && !data->is_preview)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          g_signal_emit (data->op, signals[END_PRINT], 0, priv->print_context);
Packit Service fb6fa5
          priv->end_run (data->op, priv->is_sync, priv->cancelled);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      update_progress (data);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return !done;
Packit Service fb6fa5
}
Packit Service fb6fa5
  
Packit Service fb6fa5
static void
Packit Service fb6fa5
handle_progress_response (GtkWidget *dialog, 
Packit Service fb6fa5
			  gint       response,
Packit Service fb6fa5
			  gpointer   data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperation *op = (GtkPrintOperation *)data;
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_widget_hide (dialog);
Packit Service fb6fa5
  gtk_print_operation_cancel (op);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
show_progress_timeout (PrintPagesData *data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_window_present (GTK_WINDOW (data->progress));
Packit Service fb6fa5
Packit Service fb6fa5
  data->op->priv->show_progress_timeout_id = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
print_pages (GtkPrintOperation       *op,
Packit Service fb6fa5
	     GtkWindow               *parent,
Packit Service fb6fa5
	     gboolean                 do_print,
Packit Service fb6fa5
	     GtkPrintOperationResult  result)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv = op->priv;
Packit Service fb6fa5
  PrintPagesData *data;
Packit Service fb6fa5
 
Packit Service fb6fa5
  if (!do_print) 
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gtk_print_operation_set_status (op, GTK_PRINT_STATUS_FINISHED_ABORTED, NULL);
Packit Service fb6fa5
      g_signal_emit (op, signals[DONE], 0, result);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
  }
Packit Service fb6fa5
  
Packit Service fb6fa5
  _gtk_print_operation_set_status (op, GTK_PRINT_STATUS_PREPARING, NULL);  
Packit Service fb6fa5
Packit Service fb6fa5
  data = g_new0 (PrintPagesData, 1);
Packit Service fb6fa5
  data->op = g_object_ref (op);
Packit Service fb6fa5
  data->is_preview = (priv->action == GTK_PRINT_OPERATION_ACTION_PREVIEW);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->show_progress)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GtkWidget *progress;
Packit Service fb6fa5
Packit Service fb6fa5
      progress = gtk_message_dialog_new (parent, 0, 
Packit Service fb6fa5
					 GTK_MESSAGE_OTHER,
Packit Service fb6fa5
					 GTK_BUTTONS_CANCEL,
Packit Service fb6fa5
					 _("Preparing"));
Packit Service fb6fa5
      g_signal_connect (progress, "response", 
Packit Service fb6fa5
			G_CALLBACK (handle_progress_response), op);
Packit Service fb6fa5
Packit Service fb6fa5
      priv->show_progress_timeout_id = 
Packit Service fb6fa5
	gdk_threads_add_timeout (SHOW_PROGRESS_TIME, 
Packit Service fb6fa5
		       (GSourceFunc)show_progress_timeout,
Packit Service fb6fa5
		       data);
Packit Service fb6fa5
Packit Service fb6fa5
      data->progress = progress;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (data->is_preview)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gboolean handled;
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_signal_emit_by_name (op, "preview",
Packit Service fb6fa5
			     GTK_PRINT_OPERATION_PREVIEW (op),
Packit Service fb6fa5
			     priv->print_context,
Packit Service fb6fa5
			     parent,
Packit Service fb6fa5
			     &handled);
Packit Service fb6fa5
Packit Service fb6fa5
      if (!handled)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GtkWidget *error_dialog;
Packit Service fb6fa5
Packit Service fb6fa5
          error_dialog = gtk_message_dialog_new (parent,
Packit Service fb6fa5
                                                 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
Packit Service fb6fa5
                                                 GTK_MESSAGE_ERROR,
Packit Service fb6fa5
                                                 GTK_BUTTONS_OK,
Packit Service fb6fa5
                                                 _("Error creating print preview"));
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (error_dialog),
Packit Service fb6fa5
                                                    _("The most probable reason is that a temporary file could not be created."));
Packit Service fb6fa5
Packit Service fb6fa5
          if (parent && parent->group)
Packit Service fb6fa5
            gtk_window_group_add_window (parent->group, GTK_WINDOW (error_dialog));
Packit Service fb6fa5
Packit Service fb6fa5
          g_signal_connect (error_dialog, "response",
Packit Service fb6fa5
                            G_CALLBACK (gtk_widget_destroy), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
          gtk_widget_show (error_dialog);
Packit Service fb6fa5
Packit Service fb6fa5
          print_pages_idle_done (data);
Packit Service fb6fa5
Packit Service fb6fa5
          return;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (gtk_print_context_get_cairo_context (priv->print_context) == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          /* Programmer error */
Packit Service fb6fa5
          g_error ("You must set a cairo context on the print context");
Packit Service fb6fa5
        }
Packit Service fb6fa5
      
Packit Service fb6fa5
      priv->start_page = preview_start_page;
Packit Service fb6fa5
      priv->end_page = preview_end_page;
Packit Service fb6fa5
      priv->end_run = preview_end_run;
Packit Service fb6fa5
Packit Service fb6fa5
      priv->print_pages = gtk_print_settings_get_print_pages (priv->print_settings);
Packit Service fb6fa5
      priv->page_ranges = gtk_print_settings_get_page_ranges (priv->print_settings,
Packit Service fb6fa5
							      &priv->num_page_ranges);
Packit Service fb6fa5
      priv->manual_num_copies = 1;
Packit Service fb6fa5
      priv->manual_collation = FALSE;
Packit Service fb6fa5
      priv->manual_reverse = gtk_print_settings_get_reverse (priv->print_settings);
Packit Service fb6fa5
      priv->manual_page_set = gtk_print_settings_get_page_set (priv->print_settings);
Packit Service fb6fa5
      priv->manual_scale = gtk_print_settings_get_scale (priv->print_settings) / 100.0;
Packit Service fb6fa5
      priv->manual_orientation = TRUE;
Packit Service fb6fa5
      priv->manual_number_up = gtk_print_settings_get_number_up (priv->print_settings);
Packit Service fb6fa5
      priv->manual_number_up_layout = gtk_print_settings_get_number_up_layout (priv->print_settings);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  priv->print_pages_idle_id = gdk_threads_add_idle_full (G_PRIORITY_DEFAULT_IDLE + 10,
Packit Service fb6fa5
					                 print_pages_idle, 
Packit Service fb6fa5
					                 data, 
Packit Service fb6fa5
					                 print_pages_idle_done);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Recursive main loop to make sure we don't exit  on sync operations  */
Packit Service fb6fa5
  if (priv->is_sync)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->rloop = g_main_loop_new (NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_ref (op);
Packit Service fb6fa5
      GDK_THREADS_LEAVE ();
Packit Service fb6fa5
      g_main_loop_run (priv->rloop);
Packit Service fb6fa5
      GDK_THREADS_ENTER ();
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_main_loop_unref (priv->rloop);
Packit Service fb6fa5
      priv->rloop = NULL;
Packit Service fb6fa5
      g_object_unref (op);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_error:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @error: return location for the error
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Call this when the result of a print operation is
Packit Service fb6fa5
 * %GTK_PRINT_OPERATION_RESULT_ERROR, either as returned by 
Packit Service fb6fa5
 * gtk_print_operation_run(), or in the #GtkPrintOperation::done signal 
Packit Service fb6fa5
 * handler. The returned #GError will contain more details on what went wrong.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_get_error (GtkPrintOperation  *op,
Packit Service fb6fa5
			       GError            **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_propagate_error (error, op->priv->error);
Packit Service fb6fa5
Packit Service fb6fa5
  op->priv->error = NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_run:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @action: the action to start
Packit Service fb6fa5
 * @parent: (allow-none): Transient parent of the dialog
Packit Service fb6fa5
 * @error: (allow-none): Return location for errors, or %NULL
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Runs the print operation, by first letting the user modify
Packit Service fb6fa5
 * print settings in the print dialog, and then print the document.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Normally that this function does not return until the rendering of all 
Packit Service fb6fa5
 * pages is complete. You can connect to the 
Packit Service fb6fa5
 * #GtkPrintOperation::status-changed signal on @op to obtain some 
Packit Service fb6fa5
 * information about the progress of the print operation. 
Packit Service fb6fa5
 * Furthermore, it may use a recursive mainloop to show the print dialog.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If you call gtk_print_operation_set_allow_async() or set the 
Packit Service fb6fa5
 * #GtkPrintOperation:allow-async property the operation will run 
Packit Service fb6fa5
 * asynchronously if this is supported on the platform. The 
Packit Service fb6fa5
 * #GtkPrintOperation::done signal will be emitted with the result of the 
Packit Service fb6fa5
 * operation when the it is done (i.e. when the dialog is canceled, or when 
Packit Service fb6fa5
 * the print succeeds or fails).
Packit Service fb6fa5
 * |[
Packit Service fb6fa5
 * if (settings != NULL)
Packit Service fb6fa5
 *   gtk_print_operation_set_print_settings (print, settings);
Packit Service fb6fa5
 *   
Packit Service fb6fa5
 * if (page_setup != NULL)
Packit Service fb6fa5
 *   gtk_print_operation_set_default_page_setup (print, page_setup);
Packit Service fb6fa5
 *   
Packit Service fb6fa5
 * g_signal_connect (print, "begin-print", 
Packit Service fb6fa5
 *                   G_CALLBACK (begin_print), &data);
Packit Service fb6fa5
 * g_signal_connect (print, "draw-page", 
Packit Service fb6fa5
 *                   G_CALLBACK (draw_page), &data);
Packit Service fb6fa5
 *  
Packit Service fb6fa5
 * res = gtk_print_operation_run (print, 
Packit Service fb6fa5
 *                                GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG, 
Packit Service fb6fa5
 *                                parent, 
Packit Service fb6fa5
 *                                &error);
Packit Service fb6fa5
 *  
Packit Service fb6fa5
 * if (res == GTK_PRINT_OPERATION_RESULT_ERROR)
Packit Service fb6fa5
 *  {
Packit Service fb6fa5
 *    error_dialog = gtk_message_dialog_new (GTK_WINDOW (parent),
Packit Service fb6fa5
 *   			                     GTK_DIALOG_DESTROY_WITH_PARENT,
Packit Service fb6fa5
 * 					     GTK_MESSAGE_ERROR,
Packit Service fb6fa5
 * 					     GTK_BUTTONS_CLOSE,
Packit Service fb6fa5
 * 					     "Error printing file:\n%s",
Packit Service fb6fa5
 * 					     error->message);
Packit Service fb6fa5
 *    g_signal_connect (error_dialog, "response", 
Packit Service fb6fa5
 *                      G_CALLBACK (gtk_widget_destroy), NULL);
Packit Service fb6fa5
 *    gtk_widget_show (error_dialog);
Packit Service fb6fa5
 *    g_error_free (error);
Packit Service fb6fa5
 *  }
Packit Service fb6fa5
 * else if (res == GTK_PRINT_OPERATION_RESULT_APPLY)
Packit Service fb6fa5
 *  {
Packit Service fb6fa5
 *    if (settings != NULL)
Packit Service fb6fa5
 *	g_object_unref (settings);
Packit Service fb6fa5
 *    settings = g_object_ref (gtk_print_operation_get_print_settings (print));
Packit Service fb6fa5
 *  }
Packit Service fb6fa5
 * ]|
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that gtk_print_operation_run() can only be called once on a
Packit Service fb6fa5
 * given #GtkPrintOperation.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: the result of the print operation. A return value of 
Packit Service fb6fa5
 *   %GTK_PRINT_OPERATION_RESULT_APPLY indicates that the printing was
Packit Service fb6fa5
 *   completed successfully. In this case, it is a good idea to obtain 
Packit Service fb6fa5
 *   the used print settings with gtk_print_operation_get_print_settings() 
Packit Service fb6fa5
 *   and store them for reuse with the next print operation. A value of
Packit Service fb6fa5
 *   %GTK_PRINT_OPERATION_RESULT_IN_PROGRESS means the operation is running
Packit Service fb6fa5
 *   asynchronously, and will emit the #GtkPrintOperation::done signal when 
Packit Service fb6fa5
 *   done.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkPrintOperationResult
Packit Service fb6fa5
gtk_print_operation_run (GtkPrintOperation        *op,
Packit Service fb6fa5
			 GtkPrintOperationAction   action,
Packit Service fb6fa5
			 GtkWindow                *parent,
Packit Service fb6fa5
			 GError                  **error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
  GtkPrintOperationResult result;
Packit Service fb6fa5
  GtkPageSetup *page_setup;
Packit Service fb6fa5
  gboolean do_print;
Packit Service fb6fa5
  gboolean run_print_pages;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), 
Packit Service fb6fa5
                        GTK_PRINT_OPERATION_RESULT_ERROR);
Packit Service fb6fa5
  g_return_val_if_fail (op->priv->status == GTK_PRINT_STATUS_INITIAL,
Packit Service fb6fa5
                        GTK_PRINT_OPERATION_RESULT_ERROR);
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
  
Packit Service fb6fa5
  run_print_pages = TRUE;
Packit Service fb6fa5
  do_print = FALSE;
Packit Service fb6fa5
  priv->error = NULL;
Packit Service fb6fa5
  priv->action = action;
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->print_settings == NULL)
Packit Service fb6fa5
    priv->print_settings = gtk_print_settings_new ();
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (action == GTK_PRINT_OPERATION_ACTION_EXPORT)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* note: if you implement async EXPORT, update the docs
Packit Service fb6fa5
       * docs for the allow-async property.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      priv->is_sync = TRUE;
Packit Service fb6fa5
      g_return_val_if_fail (priv->export_filename != NULL, GTK_PRINT_OPERATION_RESULT_ERROR);
Packit Service fb6fa5
      result = run_pdf (op, parent, &do_print);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (action == GTK_PRINT_OPERATION_ACTION_PREVIEW)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->is_sync = !priv->allow_async;
Packit Service fb6fa5
      priv->print_context = _gtk_print_context_new (op);
Packit Service fb6fa5
      page_setup = create_page_setup (op);
Packit Service fb6fa5
      _gtk_print_context_set_page_setup (priv->print_context, page_setup);
Packit Service fb6fa5
      g_object_unref (page_setup);
Packit Service fb6fa5
      do_print = TRUE;
Packit Service fb6fa5
      result = priv->is_sync ? GTK_PRINT_OPERATION_RESULT_APPLY : GTK_PRINT_OPERATION_RESULT_IN_PROGRESS;
Packit Service fb6fa5
    }
Packit Service fb6fa5
#ifndef G_OS_WIN32
Packit Service fb6fa5
  else if (priv->allow_async)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->is_sync = FALSE;
Packit Service fb6fa5
      _gtk_print_operation_platform_backend_run_dialog_async (op,
Packit Service fb6fa5
							      action == GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
Packit Service fb6fa5
							      parent,
Packit Service fb6fa5
							      print_pages);
Packit Service fb6fa5
      result = GTK_PRINT_OPERATION_RESULT_IN_PROGRESS;
Packit Service fb6fa5
      run_print_pages = FALSE; /* print_pages is called asynchronously from dialog */
Packit Service fb6fa5
    }
Packit Service fb6fa5
#endif
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->is_sync = TRUE;
Packit Service fb6fa5
      result = _gtk_print_operation_platform_backend_run_dialog (op, 
Packit Service fb6fa5
								 action == GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG,
Packit Service fb6fa5
								 parent,
Packit Service fb6fa5
								 &do_print);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (run_print_pages)
Packit Service fb6fa5
    print_pages (op, parent, do_print, result);
Packit Service fb6fa5
Packit Service fb6fa5
  if (priv->error && error)
Packit Service fb6fa5
    *error = g_error_copy (priv->error);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_cancel:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Cancels a running print operation. This function may
Packit Service fb6fa5
 * be called from a #GtkPrintOperation::begin-print, 
Packit Service fb6fa5
 * #GtkPrintOperation::paginate or #GtkPrintOperation::draw-page
Packit Service fb6fa5
 * signal handler to stop the currently running print 
Packit Service fb6fa5
 * operation.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.10
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_cancel (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
  
Packit Service fb6fa5
  op->priv->cancelled = TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_support_selection:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @support_selection: %TRUE to support selection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets whether selection is supported by #GtkPrintOperation.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.18
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_support_selection (GtkPrintOperation  *op,
Packit Service fb6fa5
                                           gboolean            support_selection)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  support_selection = support_selection != FALSE;
Packit Service fb6fa5
  if (priv->support_selection != support_selection)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->support_selection = support_selection;
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "support-selection");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_support_selection:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the value of #GtkPrintOperation::support-selection property.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns: whether the application supports print of selection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.18
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_print_operation_get_support_selection (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->support_selection;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_set_has_selection:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 * @has_selection: %TRUE indicates that a selection exists
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets whether there is a selection to print.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Application has to set number of pages to which the selection
Packit Service fb6fa5
 * will draw by gtk_print_operation_set_n_pages() in a callback of
Packit Service fb6fa5
 * #GtkPrintOperation::begin-print.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.18
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gtk_print_operation_set_has_selection (GtkPrintOperation  *op,
Packit Service fb6fa5
                                       gboolean            has_selection)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintOperationPrivate *priv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GTK_IS_PRINT_OPERATION (op));
Packit Service fb6fa5
Packit Service fb6fa5
  priv = op->priv;
Packit Service fb6fa5
Packit Service fb6fa5
  has_selection = has_selection != FALSE;
Packit Service fb6fa5
  if (priv->has_selection != has_selection)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      priv->has_selection = has_selection;
Packit Service fb6fa5
      g_object_notify (G_OBJECT (op), "has-selection");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_has_selection:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the value of #GtkPrintOperation::has-selection property.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns: whether there is a selection
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.18
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gtk_print_operation_get_has_selection (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->has_selection;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_operation_get_n_pages_to_print:
Packit Service fb6fa5
 * @op: a #GtkPrintOperation
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns the number of pages that will be printed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that this value is set during print preparation phase
Packit Service fb6fa5
 * (%GTK_PRINT_STATUS_PREPARING), so this function should never be
Packit Service fb6fa5
 * called before the data generation phase (%GTK_PRINT_STATUS_GENERATING_DATA).
Packit Service fb6fa5
 * You can connect to the #GtkPrintOperation::status-changed signal
Packit Service fb6fa5
 * and call gtk_print_operation_get_n_pages_to_print() when
Packit Service fb6fa5
 * print status is %GTK_PRINT_STATUS_GENERATING_DATA.
Packit Service fb6fa5
 * This is typically used to track the progress of print operation.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: the number of pages that will be printed
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.18
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gint
Packit Service fb6fa5
gtk_print_operation_get_n_pages_to_print (GtkPrintOperation *op)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GTK_IS_PRINT_OPERATION (op), -1);
Packit Service fb6fa5
Packit Service fb6fa5
  return op->priv->nr_of_pages_to_print;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GTK_PRINT_OPERATION_C__
Packit Service fb6fa5
#include "gtkaliasdef.c"