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

Reply via email to