Dear Carlos, Looks like that the file libview/ev-print-operation.c is not being compiled during make. Where is the .o file?
See: [pe...@lenny-i386-/devel/evince-backports/evince-2.29.92/libview]$ ls ev-annotation-window.c libevview_la-ev-annotation-window.lo ev-annotation-window.h libevview_la-ev-annotation-window.o ev-document-model.c libevview_la-ev-document-model.lo ev-document-model.h libevview_la-ev-document-model.o ev-jobs.c libevview_la-ev-job-scheduler.lo ev-job-scheduler.c libevview_la-ev-job-scheduler.o ev-job-scheduler.h libevview_la-ev-jobs.lo ev-jobs.h libevview_la-ev-jobs.o ev-page-cache.c libevview_la-ev-page-cache.lo ev-page-cache.h libevview_la-ev-page-cache.o ev-pixbuf-cache.c libevview_la-ev-pixbuf-cache.lo ev-pixbuf-cache.h libevview_la-ev-pixbuf-cache.o ev-print-operation.c libevview_la-ev-print-operation.lo ev-print-operation.h libevview_la-ev-print-operation.o ev-stock-icons.c libevview_la-ev-stock-icons.lo ev-stock-icons.h libevview_la-ev-stock-icons.o ev-timeline.c libevview_la-ev-timeline.lo ev-timeline.h libevview_la-ev-timeline.o ev-transition-animation.c libevview_la-ev-transition-animation.lo ev-transition-animation.h libevview_la-ev-transition-animation.o ev-view-accessible.c libevview_la-ev-view-accessible.lo ev-view-accessible.h libevview_la-ev-view-accessible.o ev-view.c libevview_la-ev-view-cursor.lo ev-view-cursor.c libevview_la-ev-view-cursor.o ev-view-cursor.h libevview_la-ev-view.lo ev-view.h libevview_la-ev-view-marshal.lo ev-view-marshal.c libevview_la-ev-view-marshal.o ev-view-marshal.h libevview_la-ev-view.o ev-view-marshal.list libevview_la-ev-view-presentation.lo ev-view-presentation.c libevview_la-ev-view-presentation.o ev-view-presentation.h libevview_la-ev-view-type-builtins.lo ev-view-private.h libevview_la-ev-view-type-builtins.o ev-view-type-builtins.c Makefile ev-view-type-builtins.c.template Makefile.am ev-view-type-builtins.h Makefile.in ev-view-type-builtins.h.template stamp-ev-view-type-builtins.h libevview.la What is missing? Thanks! Peter On Tue, Jun 15, 2010 at 10:28 AM, Peter Senna Tschudin < [email protected]> wrote: > Dear Carlos, > > In the past month I wrote a code to send Alt-p to the print dialog in order > do print. But this is not a 100% effective method and I have followed your > instructons to update Evince. > > I'm testing evince 2.29.92. Configure with: ./configure --disable-ps > --disable-dvi > > The code I have changed is: > #vi libview/ev-print-operation.c > :1621 > > static void > ev_print_operation_print_run (EvPrintOperation *op, > GtkWindow *parent) > { > EvPrintOperationPrint *print = EV_PRINT_OPERATION_PRINT (op); > > gtk_print_operation_run (print->op, > GTK_PRINT_OPERATION_ACTION_PRINT, > parent, NULL); > } > > But the change has no effect. Evince shows the print dialog when the second > argument is GTK_PRINT_OPERATION_ACTION_PRINT and when it > is GTK_PRINT_OPERATION_ACTION_PRINT_DIALOG. > > What am I doing wrong? > > Thanks! > > 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 > -- Peter Senna Tschudin [email protected] gpg id: 48274C36
_______________________________________________ evince-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/evince-list
