Re: g_signal_emit_by_name + Evince + GtkPrintUnixDialog
- From: Peter Senna Tschudin <peter senna gmail com>
- To: Carlos Garcia Campos <carlosgc gnome org>
- Cc: evince-list <evince-list gnome org>
- Subject: Re: g_signal_emit_by_name + Evince + GtkPrintUnixDialog
- Date: Tue, 15 Jun 2010 11:03:54 -0300
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
What is missing?
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.
Thanks!
Peter
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
>
--
--
Peter Senna Tschudin
peter senna gmail comgpg id: 48274C36
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]