Excerpts from Peter Senna Tschudin's message of mar jun 15 16:03:54 +0200 2010: > Dear Carlos, > > Looks like that the file libview/ev-print-operation.c is not being compiled > during make. Where is the .o file? > > See: > [peter 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? what GTK+ version do you have? > Thanks! > > Peter > > > On Tue, Jun 15, 2010 at 10:28 AM, Peter Senna Tschudin < > peter senna gmail com> 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 <carlosgc gnome org>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
Attachment:
signature.asc
Description: PGP signature