Blame modules/printbackends/lpr/gtkprintbackendlpr.c

Packit Service fb6fa5
/* GTK - The GIMP Toolkit
Packit Service fb6fa5
 * gtkprintbackendlpr.c: LPR implementation of GtkPrintBackend 
Packit Service fb6fa5
 * for printing to lpr 
Packit Service fb6fa5
 * Copyright (C) 2006, 2007 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
#include <unistd.h>
Packit Service fb6fa5
#include <sys/types.h>
Packit Service fb6fa5
#include <sys/stat.h>
Packit Service fb6fa5
#include <fcntl.h>
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <errno.h>
Packit Service fb6fa5
#include <cairo.h>
Packit Service fb6fa5
#include <cairo-ps.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <glib/gi18n-lib.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
#include "gtkprinter-private.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gtkprintbackendlpr.h"
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct _GtkPrintBackendLprClass GtkPrintBackendLprClass;
Packit Service fb6fa5
Packit Service fb6fa5
#define GTK_PRINT_BACKEND_LPR_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_PRINT_BACKEND_LPR, GtkPrintBackendLprClass))
Packit Service fb6fa5
#define GTK_IS_PRINT_BACKEND_LPR_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_PRINT_BACKEND_LPR))
Packit Service fb6fa5
#define GTK_PRINT_BACKEND_LPR_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_PRINT_BACKEND_LPR, GtkPrintBackendLprClass))
Packit Service fb6fa5
Packit Service fb6fa5
#define _LPR_MAX_CHUNK_SIZE 8192
Packit Service fb6fa5
Packit Service fb6fa5
static GType print_backend_lpr_type = 0;
Packit Service fb6fa5
Packit Service fb6fa5
struct _GtkPrintBackendLprClass
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintBackendClass parent_class;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
struct _GtkPrintBackendLpr
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintBackend parent_instance;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static GObjectClass *backend_parent_class;
Packit Service fb6fa5
Packit Service fb6fa5
static void                 gtk_print_backend_lpr_class_init      (GtkPrintBackendLprClass *class);
Packit Service fb6fa5
static void                 gtk_print_backend_lpr_init            (GtkPrintBackendLpr      *impl);
Packit Service fb6fa5
static void                 lpr_printer_get_settings_from_options (GtkPrinter              *printer,
Packit Service fb6fa5
								   GtkPrinterOptionSet     *options,
Packit Service fb6fa5
								   GtkPrintSettings        *settings);
Packit Service fb6fa5
static GtkPrinterOptionSet *lpr_printer_get_options               (GtkPrinter              *printer,
Packit Service fb6fa5
								   GtkPrintSettings        *settings,
Packit Service fb6fa5
								   GtkPageSetup            *page_setup,
Packit Service fb6fa5
								   GtkPrintCapabilities     capabilities);
Packit Service fb6fa5
static void                 lpr_printer_prepare_for_print         (GtkPrinter              *printer,
Packit Service fb6fa5
								   GtkPrintJob             *print_job,
Packit Service fb6fa5
								   GtkPrintSettings        *settings,
Packit Service fb6fa5
								   GtkPageSetup            *page_setup);
Packit Service fb6fa5
static cairo_surface_t *    lpr_printer_create_cairo_surface      (GtkPrinter              *printer,
Packit Service fb6fa5
								   GtkPrintSettings        *settings,
Packit Service fb6fa5
								   gdouble                  width,
Packit Service fb6fa5
								   gdouble                  height,
Packit Service fb6fa5
								   GIOChannel              *cache_io);
Packit Service fb6fa5
static void                 gtk_print_backend_lpr_print_stream    (GtkPrintBackend         *print_backend,
Packit Service fb6fa5
								   GtkPrintJob             *job,
Packit Service fb6fa5
								   GIOChannel              *data_io,
Packit Service fb6fa5
								   GtkPrintJobCompleteFunc  callback,
Packit Service fb6fa5
								   gpointer                 user_data,
Packit Service fb6fa5
								   GDestroyNotify           dnotify);
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_backend_lpr_register_type (GTypeModule *module)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const GTypeInfo print_backend_lpr_info =
Packit Service fb6fa5
  {
Packit Service fb6fa5
    sizeof (GtkPrintBackendLprClass),
Packit Service fb6fa5
    NULL,		/* base_init */
Packit Service fb6fa5
    NULL,		/* base_finalize */
Packit Service fb6fa5
    (GClassInitFunc) gtk_print_backend_lpr_class_init,
Packit Service fb6fa5
    NULL,		/* class_finalize */
Packit Service fb6fa5
    NULL,		/* class_data */
Packit Service fb6fa5
    sizeof (GtkPrintBackendLpr),
Packit Service fb6fa5
    0,		/* n_preallocs */
Packit Service fb6fa5
    (GInstanceInitFunc) gtk_print_backend_lpr_init,
Packit Service fb6fa5
  };
Packit Service fb6fa5
Packit Service fb6fa5
  print_backend_lpr_type = g_type_module_register_type (module,
Packit Service fb6fa5
                                                        GTK_TYPE_PRINT_BACKEND,
Packit Service fb6fa5
                                                        "GtkPrintBackendLpr",
Packit Service fb6fa5
                                                        &print_backend_lpr_info, 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
G_MODULE_EXPORT void 
Packit Service fb6fa5
pb_module_init (GTypeModule *module)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_print_backend_lpr_register_type (module);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
G_MODULE_EXPORT void 
Packit Service fb6fa5
pb_module_exit (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
Packit Service fb6fa5
}
Packit Service fb6fa5
  
Packit Service fb6fa5
G_MODULE_EXPORT GtkPrintBackend * 
Packit Service fb6fa5
pb_module_create (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gtk_print_backend_lpr_new ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * GtkPrintBackendLpr
Packit Service fb6fa5
 */
Packit Service fb6fa5
GType
Packit Service fb6fa5
gtk_print_backend_lpr_get_type (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return print_backend_lpr_type;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gtk_print_backend_lpr_new:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Creates a new #GtkPrintBackendLpr object. #GtkPrintBackendLpr
Packit Service fb6fa5
 * implements the #GtkPrintBackend interface with direct access to
Packit Service fb6fa5
 * the filesystem using Unix/Linux API calls
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: the new #GtkPrintBackendLpr object
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GtkPrintBackend *
Packit Service fb6fa5
gtk_print_backend_lpr_new (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_object_new (GTK_TYPE_PRINT_BACKEND_LPR, NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_backend_lpr_class_init (GtkPrintBackendLprClass *class)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrintBackendClass *backend_class = GTK_PRINT_BACKEND_CLASS (class);
Packit Service fb6fa5
  
Packit Service fb6fa5
  backend_parent_class = g_type_class_peek_parent (class);
Packit Service fb6fa5
Packit Service fb6fa5
  backend_class->print_stream = gtk_print_backend_lpr_print_stream;
Packit Service fb6fa5
  backend_class->printer_create_cairo_surface = lpr_printer_create_cairo_surface;
Packit Service fb6fa5
  backend_class->printer_get_options = lpr_printer_get_options;
Packit Service fb6fa5
  backend_class->printer_get_settings_from_options = lpr_printer_get_settings_from_options;
Packit Service fb6fa5
  backend_class->printer_prepare_for_print = lpr_printer_prepare_for_print;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static cairo_status_t
Packit Service fb6fa5
_cairo_write (void                *closure,
Packit Service fb6fa5
              const unsigned char *data,
Packit Service fb6fa5
              unsigned int         length)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GIOChannel *io = (GIOChannel *)closure;
Packit Service fb6fa5
  gsize written;
Packit Service fb6fa5
  GError *error;
Packit Service fb6fa5
Packit Service fb6fa5
  error = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_NOTE (PRINTING,
Packit Service fb6fa5
            g_print ("LPR Backend: Writting %i byte chunk to temp file\n", length));
Packit Service fb6fa5
Packit Service fb6fa5
  while (length > 0) 
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_io_channel_write_chars (io, (const gchar*)data, length, &written, &error);
Packit Service fb6fa5
Packit Service fb6fa5
      if (error != NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GTK_NOTE (PRINTING,
Packit Service fb6fa5
                     g_print ("LPR Backend: Error writting to temp file, %s\n", error->message));
Packit Service fb6fa5
Packit Service fb6fa5
          g_error_free (error);
Packit Service fb6fa5
	  return CAIRO_STATUS_WRITE_ERROR;
Packit Service fb6fa5
	}    
Packit Service fb6fa5
Packit Service fb6fa5
      GTK_NOTE (PRINTING,
Packit Service fb6fa5
                g_print ("LPR Backend: Wrote %" G_GSIZE_FORMAT " bytes to temp file\n", written));
Packit Service fb6fa5
Packit Service fb6fa5
      data += written;
Packit Service fb6fa5
      length -= written;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return CAIRO_STATUS_SUCCESS;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static cairo_surface_t *
Packit Service fb6fa5
lpr_printer_create_cairo_surface (GtkPrinter       *printer,
Packit Service fb6fa5
				  GtkPrintSettings *settings,
Packit Service fb6fa5
				  gdouble           width, 
Packit Service fb6fa5
				  gdouble           height,
Packit Service fb6fa5
				  GIOChannel       *cache_io)
Packit Service fb6fa5
{
Packit Service fb6fa5
  cairo_surface_t *surface;
Packit Service fb6fa5
  
Packit Service fb6fa5
  surface = cairo_ps_surface_create_for_stream (_cairo_write, cache_io, width, height);
Packit Service fb6fa5
Packit Service fb6fa5
  cairo_surface_set_fallback_resolution (surface,
Packit Service fb6fa5
                                         2.0 * gtk_print_settings_get_printer_lpi (settings),
Packit Service fb6fa5
                                         2.0 * gtk_print_settings_get_printer_lpi (settings));
Packit Service fb6fa5
Packit Service fb6fa5
  return surface;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct {
Packit Service fb6fa5
  GtkPrintBackend *backend;
Packit Service fb6fa5
  GtkPrintJobCompleteFunc callback;
Packit Service fb6fa5
  GtkPrintJob *job;
Packit Service fb6fa5
  gpointer user_data;
Packit Service fb6fa5
  GDestroyNotify dnotify;
Packit Service fb6fa5
Packit Service fb6fa5
  GIOChannel *in;
Packit Service fb6fa5
} _PrintStreamData;
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
lpr_print_cb (GtkPrintBackendLpr *print_backend,
Packit Service fb6fa5
              GError             *error,
Packit Service fb6fa5
              gpointer            user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  _PrintStreamData *ps = (_PrintStreamData *) user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  if (ps->in != NULL) 
Packit Service fb6fa5
    g_io_channel_unref (ps->in);
Packit Service fb6fa5
Packit Service fb6fa5
  if (ps->callback)
Packit Service fb6fa5
    ps->callback (ps->job, ps->user_data, error);
Packit Service fb6fa5
Packit Service fb6fa5
  if (ps->dnotify)
Packit Service fb6fa5
    ps->dnotify (ps->user_data);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_print_job_set_status (ps->job, 
Packit Service fb6fa5
			    error ? GTK_PRINT_STATUS_FINISHED_ABORTED 
Packit Service fb6fa5
			          : GTK_PRINT_STATUS_FINISHED);
Packit Service fb6fa5
Packit Service fb6fa5
  if (ps->job)
Packit Service fb6fa5
    g_object_unref (ps->job);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_free (ps);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
lpr_write (GIOChannel   *source,
Packit Service fb6fa5
           GIOCondition  con,
Packit Service fb6fa5
           gpointer      user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gchar buf[_LPR_MAX_CHUNK_SIZE];
Packit Service fb6fa5
  gsize bytes_read;
Packit Service fb6fa5
  GError *error;
Packit Service fb6fa5
  GIOStatus status;
Packit Service fb6fa5
  _PrintStreamData *ps = (_PrintStreamData *) user_data;
Packit Service fb6fa5
Packit Service fb6fa5
  error = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  status = 
Packit Service fb6fa5
    g_io_channel_read_chars (source,
Packit Service fb6fa5
                             buf,
Packit Service fb6fa5
                             _LPR_MAX_CHUNK_SIZE,
Packit Service fb6fa5
                             &bytes_read,
Packit Service fb6fa5
                             &error);
Packit Service fb6fa5
Packit Service fb6fa5
  if (status != G_IO_STATUS_ERROR)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gsize bytes_written;
Packit Service fb6fa5
Packit Service fb6fa5
      g_io_channel_write_chars (ps->in,
Packit Service fb6fa5
                                buf, 
Packit Service fb6fa5
				bytes_read, 
Packit Service fb6fa5
				&bytes_written, 
Packit Service fb6fa5
				&error);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (error != NULL || status == G_IO_STATUS_EOF)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      lpr_print_cb (GTK_PRINT_BACKEND_LPR (ps->backend), 
Packit Service fb6fa5
		    error, user_data);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
      if (error != NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          GTK_NOTE (PRINTING,
Packit Service fb6fa5
                    g_print ("LPR Backend: %s\n", error->message));
Packit Service fb6fa5
Packit Service fb6fa5
          g_error_free (error);
Packit Service fb6fa5
        } 
Packit Service fb6fa5
Packit Service fb6fa5
      return FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_NOTE (PRINTING,
Packit Service fb6fa5
            g_print ("LPR Backend: Writting %" G_GSIZE_FORMAT " byte chunk to lpr pipe\n", bytes_read));
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define LPR_COMMAND "lpr"
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_backend_lpr_print_stream (GtkPrintBackend        *print_backend,
Packit Service fb6fa5
				    GtkPrintJob            *job,
Packit Service fb6fa5
				    GIOChannel             *data_io,
Packit Service fb6fa5
				    GtkPrintJobCompleteFunc callback,
Packit Service fb6fa5
				    gpointer                user_data,
Packit Service fb6fa5
				    GDestroyNotify          dnotify)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GError *print_error = NULL;
Packit Service fb6fa5
  _PrintStreamData *ps;
Packit Service fb6fa5
  GtkPrintSettings *settings;
Packit Service fb6fa5
  gint argc;
Packit Service fb6fa5
  gint in_fd;
Packit Service fb6fa5
  gchar **argv = NULL;
Packit Service fb6fa5
  const char *cmd_line;
Packit Service fb6fa5
Packit Service fb6fa5
  settings = gtk_print_job_get_settings (job);
Packit Service fb6fa5
Packit Service fb6fa5
  cmd_line = gtk_print_settings_get (settings, "lpr-commandline");
Packit Service fb6fa5
  if (cmd_line == NULL)
Packit Service fb6fa5
    cmd_line = LPR_COMMAND;
Packit Service fb6fa5
Packit Service fb6fa5
  ps = g_new0 (_PrintStreamData, 1);
Packit Service fb6fa5
  ps->callback = callback;
Packit Service fb6fa5
  ps->user_data = user_data;
Packit Service fb6fa5
  ps->dnotify = dnotify;
Packit Service fb6fa5
  ps->job = g_object_ref (job);
Packit Service fb6fa5
  ps->in = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
 /* spawn lpr with pipes and pipe ps file to lpr */
Packit Service fb6fa5
  if (!g_shell_parse_argv (cmd_line, &argc, &argv, &print_error))
Packit Service fb6fa5
    goto out;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!g_spawn_async_with_pipes (NULL,
Packit Service fb6fa5
                                 argv,
Packit Service fb6fa5
                                 NULL,
Packit Service fb6fa5
                                 G_SPAWN_SEARCH_PATH,
Packit Service fb6fa5
                                 NULL,
Packit Service fb6fa5
                                 NULL,
Packit Service fb6fa5
                                 NULL,
Packit Service fb6fa5
                                 &in_fd,
Packit Service fb6fa5
                                 NULL,
Packit Service fb6fa5
                                 NULL,
Packit Service fb6fa5
                                 &print_error))
Packit Service fb6fa5
      goto out;
Packit Service fb6fa5
Packit Service fb6fa5
  ps->in = g_io_channel_unix_new (in_fd);
Packit Service fb6fa5
Packit Service fb6fa5
  g_io_channel_set_encoding (ps->in, NULL, &print_error);
Packit Service fb6fa5
  if (print_error != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (ps->in != NULL)
Packit Service fb6fa5
        g_io_channel_unref (ps->in);
Packit Service fb6fa5
Packit Service fb6fa5
      goto out;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_io_channel_set_close_on_unref (ps->in, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  g_io_add_watch (data_io,
Packit Service fb6fa5
                  G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP,
Packit Service fb6fa5
                  (GIOFunc) lpr_write,
Packit Service fb6fa5
                  ps);
Packit Service fb6fa5
Packit Service fb6fa5
 out:
Packit Service fb6fa5
  if (argv != NULL)
Packit Service fb6fa5
    g_strfreev (argv);
Packit Service fb6fa5
Packit Service fb6fa5
  if (print_error != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      lpr_print_cb (GTK_PRINT_BACKEND_LPR (print_backend),
Packit Service fb6fa5
		    print_error, ps);
Packit Service fb6fa5
      g_error_free (print_error);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_print_backend_lpr_init (GtkPrintBackendLpr *backend)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrinter *printer;
Packit Service fb6fa5
Packit Service fb6fa5
  printer = gtk_printer_new (_("Print to LPR"),
Packit Service fb6fa5
			     GTK_PRINT_BACKEND (backend),
Packit Service fb6fa5
			     TRUE); 
Packit Service fb6fa5
  gtk_printer_set_has_details (printer, TRUE);
Packit Service fb6fa5
  gtk_printer_set_icon_name (printer, "gtk-print");
Packit Service fb6fa5
  gtk_printer_set_is_active (printer, TRUE);
Packit Service fb6fa5
  gtk_printer_set_is_default (printer, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  gtk_print_backend_add_printer (GTK_PRINT_BACKEND (backend), printer);
Packit Service fb6fa5
  g_object_unref (printer);
Packit Service fb6fa5
  gtk_print_backend_set_list_done (GTK_PRINT_BACKEND (backend));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GtkPrinterOptionSet *
Packit Service fb6fa5
lpr_printer_get_options (GtkPrinter           *printer,
Packit Service fb6fa5
			 GtkPrintSettings     *settings,
Packit Service fb6fa5
			 GtkPageSetup         *page_setup,
Packit Service fb6fa5
			 GtkPrintCapabilities  capabilities)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrinterOptionSet *set;
Packit Service fb6fa5
  GtkPrinterOption *option;
Packit Service fb6fa5
  const char *command;
Packit Service fb6fa5
  char *n_up[] = {"1", "2", "4", "6", "9", "16" };
Packit Service fb6fa5
Packit Service fb6fa5
  set = gtk_printer_option_set_new ();
Packit Service fb6fa5
Packit Service fb6fa5
  option = gtk_printer_option_new ("gtk-n-up", _("Pages Per Sheet"), GTK_PRINTER_OPTION_TYPE_PICKONE);
Packit Service fb6fa5
  gtk_printer_option_choices_from_array (option, G_N_ELEMENTS (n_up),
Packit Service fb6fa5
					 n_up, n_up);
Packit Service fb6fa5
  gtk_printer_option_set (option, "1");
Packit Service fb6fa5
  gtk_printer_option_set_add (set, option);
Packit Service fb6fa5
  g_object_unref (option);
Packit Service fb6fa5
Packit Service fb6fa5
  option = gtk_printer_option_new ("gtk-main-page-custom-input", _("Command Line"), GTK_PRINTER_OPTION_TYPE_STRING);
Packit Service fb6fa5
  gtk_printer_option_set_activates_default (option, TRUE);
Packit Service fb6fa5
  option->group = g_strdup ("GtkPrintDialogExtension");
Packit Service fb6fa5
  if (settings != NULL &&
Packit Service fb6fa5
      (command = gtk_print_settings_get (settings, "lpr-commandline"))!= NULL)
Packit Service fb6fa5
    gtk_printer_option_set (option, command);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    gtk_printer_option_set (option, LPR_COMMAND);
Packit Service fb6fa5
  gtk_printer_option_set_add (set, option);
Packit Service fb6fa5
    
Packit Service fb6fa5
  return set;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
lpr_printer_get_settings_from_options (GtkPrinter          *printer,
Packit Service fb6fa5
				       GtkPrinterOptionSet *options,
Packit Service fb6fa5
				       GtkPrintSettings    *settings)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkPrinterOption *option;
Packit Service fb6fa5
Packit Service fb6fa5
  option = gtk_printer_option_set_lookup (options, "gtk-main-page-custom-input");
Packit Service fb6fa5
  if (option)
Packit Service fb6fa5
    gtk_print_settings_set (settings, "lpr-commandline", option->value);
Packit Service fb6fa5
Packit Service fb6fa5
  option = gtk_printer_option_set_lookup (options, "gtk-n-up");
Packit Service fb6fa5
  if (option)
Packit Service fb6fa5
    gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP, option->value);
Packit Service fb6fa5
Packit Service fb6fa5
  option = gtk_printer_option_set_lookup (options, "gtk-n-up-layout");
Packit Service fb6fa5
  if (option)
Packit Service fb6fa5
    gtk_print_settings_set (settings, GTK_PRINT_SETTINGS_NUMBER_UP_LAYOUT, option->value);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
lpr_printer_prepare_for_print (GtkPrinter       *printer,
Packit Service fb6fa5
			       GtkPrintJob      *print_job,
Packit Service fb6fa5
			       GtkPrintSettings *settings,
Packit Service fb6fa5
			       GtkPageSetup     *page_setup)
Packit Service fb6fa5
{
Packit Service fb6fa5
  double scale;
Packit Service fb6fa5
Packit Service fb6fa5
  print_job->print_pages = gtk_print_settings_get_print_pages (settings);
Packit Service fb6fa5
  print_job->page_ranges = NULL;
Packit Service fb6fa5
  print_job->num_page_ranges = 0;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (print_job->print_pages == GTK_PRINT_PAGES_RANGES)
Packit Service fb6fa5
    print_job->page_ranges =
Packit Service fb6fa5
      gtk_print_settings_get_page_ranges (settings,
Packit Service fb6fa5
					  &print_job->num_page_ranges);
Packit Service fb6fa5
  
Packit Service fb6fa5
  print_job->collate = gtk_print_settings_get_collate (settings);
Packit Service fb6fa5
  print_job->reverse = gtk_print_settings_get_reverse (settings);
Packit Service fb6fa5
  print_job->num_copies = gtk_print_settings_get_n_copies (settings);
Packit Service fb6fa5
  print_job->number_up = gtk_print_settings_get_number_up (settings);
Packit Service fb6fa5
  print_job->number_up_layout = gtk_print_settings_get_number_up_layout (settings);
Packit Service fb6fa5
Packit Service fb6fa5
  scale = gtk_print_settings_get_scale (settings);
Packit Service fb6fa5
  if (scale != 100.0)
Packit Service fb6fa5
    print_job->scale = scale/100.0;
Packit Service fb6fa5
Packit Service fb6fa5
  print_job->page_set = gtk_print_settings_get_page_set (settings);
Packit Service fb6fa5
  print_job->rotate_to_orientation = TRUE;
Packit Service fb6fa5
}