Dear Carlos, Thank you for your help.
I'm using Debian Lenny source code. To update the version of Evince I need to update Lenny GTK libraries. I want to avoid this. What is the simplest way of printing directly using Evince 2.22? Thank you very much, Peter On Thu, May 20, 2010 at 3:51 AM, Carlos Garcia Campos <[email protected]>wrote: > Excerpts from Peter Senna Tschudin's message of jue may 20 01:04:54 +0200 > 2010: > > Dear list members, > > This is my first post. > > > > I'm working on a simple modification of Evince. I want that when user > choose > > "Print" Evince prints the file directly instead of showing the print > screen. > > > > See part of the source code: > > > > #vi evince-2.22.2/shell/ev-window.c > > evince 2.22 is too old, printing code has changed a lot. Since Evince > 2.28 we use GtkPrintOperation to print pdf files which already > supports printing without showing the print dialog. You only need to > use GTK_PRINT_OPERATION_ACTION_PRINT as second argument of > gtk_print_operation_run(). > > > void > > ev_window_print_range (EvWindow *ev_window, int first_page, int > last_page) > > { > > GtkWidget *dialog; > > EvPageCache *page_cache; > > gint current_page; > > gint document_last_page; > > GtkPrintCapabilities capabilities; > > > > g_return_if_fail (EV_IS_WINDOW (ev_window)); > > g_return_if_fail (ev_window->priv->document != NULL); > > > > if (ev_window->priv->print_dialog) { > > gtk_window_present (GTK_WINDOW > > (ev_window->priv->print_dialog)); > > return; > > } > > > > page_cache = ev_page_cache_get (ev_window->priv->document); > > current_page = ev_page_cache_get_current_page (page_cache); > > document_last_page = ev_page_cache_get_n_pages (page_cache); > > > > if (!ev_window->priv->print_settings) { > > ev_window->priv->print_settings = gtk_print_settings_copy > ( > > ev_application_get_print_settings (EV_APP)); > > ev_window_load_print_settings_from_metadata (ev_window); > > } > > > > if (first_page != 1 || last_page != document_last_page) { > > GtkPageRange range; > > > > /* Ranges in GtkPrint are 0 - N */ > > range.start = first_page - 1; > > range.end = last_page - 1; > > > > gtk_print_settings_set_print_pages > > (ev_window->priv->print_settings, > > > GTK_PRINT_PAGES_RANGES); > > gtk_print_settings_set_page_ranges > > (ev_window->priv->print_settings, > > &range, 1); > > } > > > > dialog = gtk_print_unix_dialog_new (_("Print"), GTK_WINDOW > > (ev_window)); > > ev_window->priv->print_dialog = dialog; > > > > capabilities = GTK_PRINT_CAPABILITY_PREVIEW | > > ev_file_exporter_get_capabilities (EV_FILE_EXPORTER > > (ev_window->priv->document)); > > gtk_print_unix_dialog_set_manual_capabilities > (GTK_PRINT_UNIX_DIALOG > > (dialog), > > capabilities); > > > > gtk_print_unix_dialog_set_current_page (GTK_PRINT_UNIX_DIALOG > > (dialog), > > current_page); > > > > gtk_print_unix_dialog_set_settings (GTK_PRINT_UNIX_DIALOG > (dialog), > > > > ev_window->priv->print_settings); > > if (ev_window->priv->print_page_setup) > > gtk_print_unix_dialog_set_page_setup > (GTK_PRINT_UNIX_DIALOG > > (dialog), > > > > ev_window->priv->print_page_setup); > > > > g_signal_connect (G_OBJECT (dialog), "response", > > G_CALLBACK > (ev_window_print_dialog_response_cb), > > ev_window); > > > > gtk_widget_show (dialog); > > > > // ********************************************** > > // I ADDED THE LINE BELOW > > // ********************************************** > > > > g_signal_emit_by_name (G_OBJECT (dialog), "response", > > GTK_RESPONSE_OK); > > > > } > > > > What am I doing wrong? :-/ > > > > After my change, when "Ctrl-P", Evince outputs: > > > > (evince:28399): GLib-GObject-CRITICAL **: g_object_ref: assertion > > `G_IS_OBJECT (object)' failed > > > > (evince:28399): Gtk-CRITICAL **: gtk_printer_accepts_ps: assertion > > `GTK_IS_PRINTER (printer)' failed > > > > (evince:28399): Gtk-CRITICAL **: gtk_printer_get_backend: assertion > > `GTK_IS_PRINTER (printer)' failed > > > > (evince:28399): GLib-GObject-CRITICAL **: g_object_ref: assertion > > `G_IS_OBJECT (object)' failed > > Segmentation fault > > > > > > But if I change GTK_RESPONSE_OK to GTK_RESPONSE_CANCEL then it works as > > expected. The print dialog is not shown, and it does not print because > > the GTK_RESPONSE_CANCEL means the cancel button. > > > > I think that the error is related to the callback > > function ev_window_print_dialog_response_cb. Here goes its untouched > code: > > > > static gboolean > > ev_window_print_dialog_response_cb (GtkDialog *dialog, > > gint response, > > EvWindow *window) > > { > > EvPrintRange *ranges = NULL; > > EvPrintPageSet page_set; > > gint n_ranges = 0; > > gint copies; > > gint pages_per_sheet; > > gboolean collate; > > gboolean reverse; > > gdouble scale; > > gint current_page; > > gdouble width; > > gdouble height; > > GtkPrintPages print_pages; > > const gchar *file_format; > > > > if (response != GTK_RESPONSE_OK && > > response != GTK_RESPONSE_APPLY) { > > gtk_widget_destroy (GTK_WIDGET (dialog)); > > window->priv->print_dialog = NULL; > > > > return FALSE; > > } > > > > window->priv->print_preview = (response == GTK_RESPONSE_APPLY); > > > > if (window->priv->printer) > > g_object_unref (window->priv->printer); > > if (window->priv->print_settings) > > g_object_unref (window->priv->print_settings); > > if (window->priv->print_page_setup) > > g_object_unref (window->priv->print_page_setup); > > > > window->priv->printer = g_object_ref ( > > gtk_print_unix_dialog_get_selected_printer > > (GTK_PRINT_UNIX_DIALOG (dialog))); > > window->priv->print_settings = g_object_ref ( > > gtk_print_unix_dialog_get_settings (GTK_PRINT_UNIX_DIALOG > > (dialog))); > > window->priv->print_page_setup = g_object_ref ( > > gtk_print_unix_dialog_get_page_setup > (GTK_PRINT_UNIX_DIALOG > > (dialog))); > > > > file_format = gtk_print_settings_get > (window->priv->print_settings, > > > > GTK_PRINT_SETTINGS_OUTPUT_FILE_FORMAT); > > > > if (!gtk_printer_accepts_ps (window->priv->printer)) { > > GtkWidget *msgdialog; > > msgdialog = gtk_message_dialog_new (GTK_WINDOW (dialog), > > GTK_DIALOG_MODAL, > > GTK_MESSAGE_ERROR, > > GTK_BUTTONS_OK, > > _("Printing is not > > supported on this printer.")); > > > > gtk_dialog_run (GTK_DIALOG (msgdialog)); > > gtk_widget_destroy (msgdialog); > > > > return FALSE; > > } > > > > ev_window_clear_print_job (window); > > > > current_page = gtk_print_unix_dialog_get_current_page > > (GTK_PRINT_UNIX_DIALOG (dialog)); > > print_pages = gtk_print_settings_get_print_pages > > (window->priv->print_settings); > > > > switch (print_pages) { > > case GTK_PRINT_PAGES_CURRENT: > > ranges = g_new0 (EvPrintRange, 1); > > > > ranges->start = current_page; > > ranges->end = current_page; > > n_ranges = 1; > > > > break; > > case GTK_PRINT_PAGES_RANGES: { > > GtkPageRange *page_range; > > > > page_range = gtk_print_settings_get_page_ranges > > (window->priv->print_settings, > > > &n_ranges); > > if (n_ranges > 0) > > ranges = g_memdup (page_range, n_ranges * sizeof > > (GtkPageRange)); > > } > > break; > > case GTK_PRINT_PAGES_ALL: { > > gint n_pages; > > > > n_pages = ev_page_cache_get_n_pages (ev_page_cache_get > > (window->priv->document)); > > > > ranges = g_new0 (EvPrintRange, 1); > > > > ranges->start = 0; > > ranges->end = n_pages - 1; > > n_ranges = 1; > > } > > break; > > } > > > > page_set = (EvPrintPageSet)gtk_print_settings_get_page_set > > (window->priv->print_settings); > > > > scale = gtk_print_settings_get_scale > (window->priv->print_settings) > > * 0.01; > > > > width = gtk_page_setup_get_paper_width > > (window->priv->print_page_setup, > > GTK_UNIT_POINTS); > > height = gtk_page_setup_get_paper_height > > (window->priv->print_page_setup, > > GTK_UNIT_POINTS); > > > > if (scale != 1.0) { > > width *= scale; > > height *= scale; > > } > > > > pages_per_sheet = gtk_print_settings_get_number_up > > (window->priv->print_settings); > > > > copies = gtk_print_settings_get_n_copies > > (window->priv->print_settings); > > collate = gtk_print_settings_get_collate > > (window->priv->print_settings); > > reverse = gtk_print_settings_get_reverse > > (window->priv->print_settings); > > > > window->priv->print_job = ev_job_print_new > (window->priv->document, > > file_format ? > > file_format : "ps", > > width, height, > > ranges, n_ranges, > > page_set, > > pages_per_sheet, > > copies, collate, > > reverse); > > > > g_signal_connect (window->priv->print_job, "finished", > > G_CALLBACK (ev_window_print_job_cb), > > window); > > /* The priority doesn't matter for this job */ > > ev_job_queue_add_job (window->priv->print_job, > EV_JOB_PRIORITY_LOW); > > > > gtk_widget_destroy (GTK_WIDGET (dialog)); > > window->priv->print_dialog = NULL; > > > > return TRUE; > > } > > > > > > Can you help me? > > > > Thanks, > > > > Peter > > > -- > Carlos Garcia Campos > PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462 > -- Peter Senna Tschudin [email protected] gpg id: 48274C36
_______________________________________________ evince-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/evince-list
