g_signal_emit_by_name + Evince + GtkPrintUnixDialog



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

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 I am 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 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 com
gpg id: 48274C36


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]