📄 gtkprintbackendtest.c
字号:
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 + -