Patch GtkPrintOperation 2.16
- From: Emmanuel Rodriguez <emmanuel rodriguez gmail com>
- To: gtk-perl-list gnome org
- Subject: Patch GtkPrintOperation 2.16
- Date: Sat, 17 Jan 2009 18:40:46 +0100
Hi,
Here's the patch for upgrading GtkPintOperation to Gtk 2.16.
The two new methods are really tricky as set_defer_drawing() has to be
called from the signal callback 'draw-page' and draw_page_finish() will
cause segmentation fault if set_defer_drawing() isn't called previously.
I've documented this in the XS through POD.
Emmanuel
Index: xs/GtkPrintOperation.xs
===================================================================
--- xs/GtkPrintOperation.xs (revision 2111)
+++ xs/GtkPrintOperation.xs (working copy)
@@ -94,6 +94,33 @@
void gtk_print_operation_cancel (GtkPrintOperation *op);
+#if GTK_CHECK_VERSION (2, 15, 0)
+
+=for apidoc
+
+=for signature $op->draw_page_finish ()
+
+The method draw_page_finish() can only be called if the method
+set_defer_drawing() has been called previously otherwise a segmentation fault
+will occur. This means that the application will crash and even an eval will not
+be able to recover from that error.
+
+=cut
+void gtk_print_operation_draw_page_finish (GtkPrintOperation *op);
+
+
+=for apidoc
+
+=for signature $op->set_defer_drawing ()
+
+The method set_defer_drawing() can only be called from the callback
+C<'draw-page'>.
+
+=cut
+void gtk_print_operation_set_defer_drawing (GtkPrintOperation *op);
+
+#endif /* 2.16 */
+
MODULE = Gtk2::PrintOperation PACKAGE = Gtk2::Print PREFIX = gtk_print_
# GtkPageSetup * gtk_print_run_page_setup_dialog (GtkWindow *parent, GtkPageSetup *page_setup,
GtkPrintSettings *settings);
Index: t/GtkPrintOperation.t
===================================================================
--- t/GtkPrintOperation.t (revision 2111)
+++ t/GtkPrintOperation.t (working copy)
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w
use strict;
use Gtk2::TestHelper
- tests => 10,
+ tests => 13,
at_least_version => [2, 10, 0, "GtkPrintOperation is new in 2.10"];
# $Id$
@@ -51,8 +51,40 @@
# FIXME: Don't know how to trigger an actual error.
# warn $op -> get_error();
+
+SKIP: {
+ skip 'draw page finish (2.16)', 3
+ unless Gtk2->CHECK_VERSION(2, 15, 0);
+
+ # NOTE draw_page_finish() has to be called under the right conditions
+ # otherwise the print context doesn't seem to be setup properly causing
+ # the program to crash with a segmentation fault.
+ #
+ # This is tricky as draw_page_finish() must be called if
+ # set_defer_drawing() is called and the latter can be called only from
+ # the 'draw-page' callback.
+
+
+ # 'draw-page' is called twice because there are 2 pages see (get_op)
+ $op = get_op();
+ $op -> signal_connect('draw-page' => sub {
+ # Pretend that the drawing is asynchronous.
+ $op -> set_defer_drawing();
+
+ # Finish the drawing latter
+ Glib::Idle->add(sub {
+ ok(TRUE, "Draw page finish called"); # Called 2 times
+ $op -> draw_page_finish();
+ });
+ });
+
+ ok(defined $op -> run("export", Gtk2::Window -> new()));
+}
+
+
unlink "test.pdf";
+
=comment
# Can't non-interactively test these, I think. I manually verified that they
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]