⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkprintbackendtest.c

📁 This GTK+ version 2.12.3. GTK+ is a multi-platform toolkit for creating graphical user interfaces.
💻 C
📖 第 1 页 / 共 2 页
字号:
  OutputFormat format;  format = format_from_settings (settings);  if (format == FORMAT_PS)    surface = cairo_ps_surface_create_for_stream (_cairo_write, cache_io, width, height);  else    surface = cairo_pdf_surface_create_for_stream (_cairo_write, cache_io, width, height);  /* TODO: DPI from settings object? */  cairo_surface_set_fallback_resolution (surface, 300, 300);  return surface;}typedef struct {  GtkPrintBackend *backend;  GtkPrintJobCompleteFunc callback;  GtkPrintJob *job;  GIOChannel *target_io;  gpointer user_data;  GDestroyNotify dnotify;} _PrintStreamData;static voidtest_print_cb (GtkPrintBackendTest *print_backend,               GError              *error,               gpointer            user_data){  _PrintStreamData *ps = (_PrintStreamData *) user_data;  if (ps->target_io != NULL)    g_io_channel_unref (ps->target_io);  if (ps->callback)    ps->callback (ps->job, ps->user_data, error);  if (ps->dnotify)    ps->dnotify (ps->user_data);  gtk_print_job_set_status (ps->job,			    (error != NULL)?GTK_PRINT_STATUS_FINISHED_ABORTED:GTK_PRINT_STATUS_FINISHED);  if (ps->job)    g_object_unref (ps->job);   g_free (ps);}static gbooleantest_write (GIOChannel   *source,            GIOCondition  con,            gpointer      user_data){  gchar buf[_STREAM_MAX_CHUNK_SIZE];  gsize bytes_read;  GError *error;  GIOStatus read_status;  _PrintStreamData *ps = (_PrintStreamData *) user_data;  error = NULL;  read_status =     g_io_channel_read_chars (source,                             buf,                             _STREAM_MAX_CHUNK_SIZE,                             &bytes_read,                             &error);  if (read_status != G_IO_STATUS_ERROR)    {      gsize bytes_written;      g_io_channel_write_chars (ps->target_io,                                 buf, 				bytes_read, 				&bytes_written, 				&error);    }  if (error != NULL || read_status == G_IO_STATUS_EOF)    {      test_print_cb (GTK_PRINT_BACKEND_TEST (ps->backend), error, user_data);      if (error != NULL)        {          GTK_NOTE (PRINTING,                    g_print ("TEST Backend: %s\n", error->message));          g_error_free (error);        }      return FALSE;    }  GTK_NOTE (PRINTING,            g_print ("TEST Backend: Writing %i byte chunk to target test\n", (int)bytes_read));  return TRUE;}static voidgtk_print_backend_test_print_stream (GtkPrintBackend        *print_backend,				     GtkPrintJob            *job,				     GIOChannel             *data_io,				     GtkPrintJobCompleteFunc callback,				     gpointer                user_data,				     GDestroyNotify          dnotify){  GError *internal_error = NULL;  GtkPrinter *printer;  _PrintStreamData *ps;  GtkPrintSettings *settings;  gchar *uri, *testname;  printer = gtk_print_job_get_printer (job);  settings = gtk_print_job_get_settings (job);  ps = g_new0 (_PrintStreamData, 1);  ps->callback = callback;  ps->user_data = user_data;  ps->dnotify = dnotify;  ps->job = g_object_ref (job);  ps->backend = print_backend;  internal_error = NULL;  uri = output_test_from_settings (settings, NULL);  testname = g_filename_from_uri (uri, NULL, &internal_error);  g_free (uri);  if (testname == NULL)    goto error;  ps->target_io = g_io_channel_new_file (testname, "w", &internal_error);  g_free (testname);  if (internal_error == NULL)    g_io_channel_set_encoding (ps->target_io, NULL, &internal_error);error:  if (internal_error != NULL)    {      test_print_cb (GTK_PRINT_BACKEND_TEST (print_backend),                    internal_error, ps);      g_error_free (internal_error);      return;    }  g_io_add_watch (data_io,                   G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP,                  (GIOFunc) test_write,                  ps);}static voidgtk_print_backend_test_init (GtkPrintBackendTest *backend){  GtkPrinter *printer;  int i;  /* make 100 of these printers */  for (i = 0; i < 100; i++)    {      char *name;       name = g_strdup_printf ("%s %i", _("Print to Test Printer"), i);      printer = g_object_new (GTK_TYPE_PRINTER,			      "name", name,			      "backend", backend,			      "is-virtual", FALSE, /* treat printer like a real one*/			      NULL);       g_free (name);      g_message ("TEST Backend: Adding printer %d\n", i);      gtk_printer_set_has_details (printer, FALSE);      gtk_printer_set_icon_name (printer, "gtk-delete"); /* use a delete icon just for fun */      gtk_printer_set_is_active (printer, TRUE);      gtk_print_backend_add_printer (GTK_PRINT_BACKEND (backend), printer);      g_object_unref (printer);    }  gtk_print_backend_set_list_done (GTK_PRINT_BACKEND (backend));}static GtkPrinterOptionSet *test_printer_get_options (GtkPrinter           *printer,			  GtkPrintSettings     *settings,			  GtkPageSetup         *page_setup,			  GtkPrintCapabilities  capabilities){  GtkPrinterOptionSet *set;  GtkPrinterOption *option;  const gchar *n_up[] = { "1" };  OutputFormat format;  format = format_from_settings (settings);  set = gtk_printer_option_set_new ();  option = gtk_printer_option_new ("gtk-n-up", _("Pages per _sheet:"), GTK_PRINTER_OPTION_TYPE_PICKONE);  gtk_printer_option_choices_from_array (option, G_N_ELEMENTS (n_up),					 (char **) n_up, (char **) n_up /* FIXME i18n (localised digits)! */);  gtk_printer_option_set (option, "1");  gtk_printer_option_set_add (set, option);  g_object_unref (option);  return set;}static voidtest_printer_get_settings_from_options (GtkPrinter          *printer,					GtkPrinterOptionSet *options,					GtkPrintSettings    *settings){}static voidtest_printer_prepare_for_print (GtkPrinter       *printer,				GtkPrintJob      *print_job,				GtkPrintSettings *settings,				GtkPageSetup     *page_setup){  gdouble scale;  print_job->print_pages = gtk_print_settings_get_print_pages (settings);  print_job->page_ranges = NULL;  print_job->num_page_ranges = 0;    if (print_job->print_pages == GTK_PRINT_PAGES_RANGES)    print_job->page_ranges =      gtk_print_settings_get_page_ranges (settings,					  &print_job->num_page_ranges);    print_job->collate = gtk_print_settings_get_collate (settings);  print_job->reverse = gtk_print_settings_get_reverse (settings);  print_job->num_copies = gtk_print_settings_get_n_copies (settings);  scale = gtk_print_settings_get_scale (settings);  if (scale != 100.0)    print_job->scale = scale/100.0;  print_job->page_set = gtk_print_settings_get_page_set (settings);  print_job->rotate_to_orientation = TRUE;}static gbooleantest_printer_details_aquired_cb (GtkPrinter *printer){  gboolean success;  gint weight;  /* weight towards success */  weight = g_random_int_range (0, 100);  success = FALSE;  if (weight < 75)    success = TRUE;  g_message ("success %i", success);  gtk_printer_set_has_details (printer, success);  g_signal_emit_by_name (printer, "details-acquired", success);  return FALSE;}static voidtest_printer_request_details (GtkPrinter *printer){  gint weight;  gint time;  /* set the timer to succeed or fail at a random time interval */  /* weight towards the shorter end */  weight = g_random_int_range (0, 100);  if (weight < 50)    time = g_random_int_range (0, 2);  else if (weight < 75)    time = g_random_int_range (1, 5);  else    time = g_random_int_range (1, 10);  g_message ("Gathering details in %i seconds", time);  if (time == 0)    time = 10;  else    time *= 1000;  g_timeout_add (time, (GSourceFunc) test_printer_details_aquired_cb, printer);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -