Re: g_signal_emit_by_name + Evince + GtkPrintUnixDialog



Hi!

>what GTK+ version do you have?
ii �libgtk2.0-0 � � � � � � � � � � 2.18.6-1~bpo50+1 � � � � The GTK+ graphical user interface library
ii �libglib2.0-0 � � � � � � � � � �2.22.4-1~bpo50+1 � � � � The GLib library of C routines

ii �libpoppler3 � � � � � � � � � � 0.12.0-backported-0 � � �Poppler 0.12.0 for Debian Lenny
ii �libopenjpeg2 � � � � � � � � �1.3+dfsg-3 � � � � � � � � � �JPEG 2000 image compression/decompression li

On Tue, Jun 15, 2010 at 12:05 PM, Carlos Garcia Campos <carlosgc gnome org> wrote:
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



--
Peter Senna Tschudin
peter senna gmail com
gpg id: 48274C36


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