gtk+ r20715 - in trunk: . gtk



Author: matthiasc
Date: Tue Jul  1 05:38:49 2008
New Revision: 20715
URL: http://svn.gnome.org/viewvc/gtk+?rev=20715&view=rev

Log:
        * gtk/gtkprintoperation-unix.c
        (_gtk_print_operation_platform_backend_create_preview_surface):
        Handle failure to create temp file by returning NULL.

        * gtk/gtkprintoperation.c (gtk_print_operation_preview_handler):
        Return FALSE if surface creation fails.

        (print_pages): If the preiew signal is not handled, show an
        error dialog.



Modified:
   trunk/ChangeLog
   trunk/gtk/gtkprintoperation-unix.c
   trunk/gtk/gtkprintoperation.c

Modified: trunk/gtk/gtkprintoperation-unix.c
==============================================================================
--- trunk/gtk/gtkprintoperation-unix.c	(original)
+++ trunk/gtk/gtkprintoperation-unix.c	Tue Jul  1 05:38:49 2008
@@ -667,6 +667,13 @@
   
   filename = g_build_filename (g_get_tmp_dir (), "previewXXXXXX.pdf", NULL);
   fd = g_mkstemp (filename);
+
+  if (fd < 0)
+    {
+      g_free (filename);
+      return NULL;
+    }
+
   *target = filename;
   
   paper_size = gtk_page_setup_get_paper_size (page_setup);
@@ -674,7 +681,7 @@
   h = gtk_paper_size_get_height (paper_size, GTK_UNIT_POINTS);
     
   *dpi_x = *dpi_y = 72;
-  surface = cairo_pdf_surface_create_for_stream (write_preview, GINT_TO_POINTER(fd), w, h);
+  surface = cairo_pdf_surface_create_for_stream (write_preview, GINT_TO_POINTER (fd), w, h);
  
   cairo_surface_set_user_data (surface, &key, GINT_TO_POINTER (fd), close_preview);
 

Modified: trunk/gtk/gtkprintoperation.c
==============================================================================
--- trunk/gtk/gtkprintoperation.c	(original)
+++ trunk/gtk/gtkprintoperation.c	Tue Jul  1 05:38:49 2008
@@ -491,6 +491,12 @@
 								  &dpi_x, &dpi_y,
 								  &pop->filename);
 
+  if (pop->surface == NULL)
+    {
+      g_free (pop);
+      return FALSE;
+    }
+
   cr = cairo_create (pop->surface);
   gtk_print_context_set_cairo_context (op->priv->print_context, cr,
 				       dpi_x, dpi_y);
@@ -2271,13 +2277,38 @@
 			     priv->print_context,
 			     parent,
 			     &handled);
-      
-      if (!handled ||
-	  gtk_print_context_get_cairo_context (priv->print_context) == NULL) 
-	{
-	  /* Programmer error */
-	  g_error ("You must set a cairo context on the print context");
-	}
+
+      if (!handled)
+        {
+          GtkMessageDialog *error_dialog;
+
+          error_dialog = gtk_message_dialog_new (parent,
+                                                 GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                                 GTK_MESSAGE_ERROR,
+                                                 GTK_BUTTONS_OK,
+                                                 _("Error creating print preview"));
+
+          gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (error_dialog),
+                                                    _("The most probable reason is that a temporary file could not be created."));
+
+          if (parent->group)
+            gtk_window_group_add_window (parent->group, GTK_WINDOW (error_dialog));
+
+          g_signal_connect (error_dialog, "response", 
+                            G_CALLBACK (gtk_widget_destroy), NULL);
+
+          gtk_widget_show (error_dialog);
+          
+          print_pages_idle_done (data);
+          
+          return;
+        }
+
+      if (gtk_print_context_get_cairo_context (priv->print_context) == NULL)
+        {
+          /* Programmer error */
+          g_error ("You must set a cairo context on the print context");
+        }
       
       priv->start_page = preview_start_page;
       priv->end_page = preview_end_page;



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