g_signal_emit_by_name + Evince + GtkPrintUnixDialog
- From: Peter Senna Tschudin <peter senna gmail com>
- To: gnome-devel-list gnome org
- Subject: g_signal_emit_by_name + Evince + GtkPrintUnixDialog
- Date: Wed, 19 May 2010 16:28:38 -0300
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
[
Date Prev][Date Next] [
Thread Prev][Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]