]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Clear gtk print job when job has finished. Fixes bug #447612.
[evince.git] / shell / ev-window.c
index 48d9b2a2b7b7ac37df06040b1d20af361b472b27..eafdb292ac5c3cd37754474e8b31690174977780 100644 (file)
@@ -192,6 +192,7 @@ struct _EvWindowPrivate {
 
 #ifdef WITH_GTK_PRINT
        EvJob            *print_job;
+       gboolean          print_preview;
        GtkPrintJob      *gtk_print_job;
        GtkPrinter       *printer;
        GtkPrintSettings *print_settings;
@@ -711,6 +712,9 @@ ev_window_add_history (EvWindow *window, gint page, EvLink *link)
        EvLinkAction *action;
        EvLinkDest *dest;
        
+       if (window->priv->history == NULL)
+               return;
+       
        if (link) {
                action = g_object_ref (ev_link_get_action (link));
                dest = ev_link_action_get_dest (action);
@@ -2168,6 +2172,11 @@ ev_window_clear_print_job (EvWindow *window)
                g_object_unref (window->priv->print_job);
                window->priv->print_job = NULL;
        }
+
+       if (window->priv->gtk_print_job) {
+               g_object_unref (window->priv->gtk_print_job);
+               window->priv->gtk_print_job = NULL;
+       }
 }
 
 static void
@@ -2201,13 +2210,8 @@ static void
 ev_window_print_send (EvWindow    *window,
                      const gchar *filename)
 {
-       GtkPrintJob *job;
        GtkPrintSettings *settings;
-       GError      *error = NULL;
        
-       if (window->priv->gtk_print_job)
-               g_object_unref (window->priv->gtk_print_job);
-
        /* Some printers take into account some print settings,
         * and others don't. However we have exported the document
         * to a ps or pdf file according to such print settings. So,
@@ -2222,25 +2226,54 @@ ev_window_print_send (EvWindow    *window,
        gtk_print_settings_set_scale (settings, 1.0);
        gtk_print_settings_set_collate (settings, FALSE);
        gtk_print_settings_set_reverse (settings, FALSE);
-       
-       job = gtk_print_job_new ("evince-print",
-                                window->priv->printer,
-                                settings,
-                                window->priv->print_page_setup);
 
-       g_object_unref (settings);
-       
-       window->priv->gtk_print_job = job;
+       if (window->priv->print_preview) {
+               gchar *uri;
+               gchar *print_settings_file = NULL;
 
-       if (gtk_print_job_set_source_file (job, filename, &error)) {
-               gtk_print_job_send (job,
-                                   (GtkPrintJobCompleteFunc)ev_window_print_finished,
-                                   window, NULL);
+               ev_application_set_print_settings (EV_APP,
+                                                  window->priv->print_settings);
+               
+#if GTK_CHECK_VERSION (2, 11, 0)
+               print_settings_file = ev_tmp_filename ("print-settings");
+               gtk_print_settings_to_file (settings, print_settings_file, NULL);
+#endif
+               uri = g_filename_to_uri (filename, NULL, NULL);
+               ev_application_open_uri_at_dest (EV_APP,
+                                                uri, 
+                                                gtk_window_get_screen (GTK_WINDOW (window)),
+                                                NULL,
+                                                EV_WINDOW_MODE_PREVIEW,
+                                                TRUE,
+                                                print_settings_file,
+                                                GDK_CURRENT_TIME);
+               g_free (print_settings_file);
+               g_free (uri);
        } else {
-               ev_window_clear_print_job (window);
-               g_warning (error->message);
-               g_error_free (error);
+               GtkPrintJob *job;
+               GError      *error = NULL;
+       
+               job = gtk_print_job_new ("evince-print",
+                                        window->priv->printer,
+                                        settings,
+                                        window->priv->print_page_setup);
+
+               if (window->priv->gtk_print_job)
+                       g_object_unref (window->priv->gtk_print_job);
+               window->priv->gtk_print_job = job;
+
+               if (gtk_print_job_set_source_file (job, filename, &error)) {
+                       gtk_print_job_send (job,
+                                           (GtkPrintJobCompleteFunc)ev_window_print_finished,
+                                           window, NULL);
+               } else {
+                       ev_window_clear_print_job (window);
+                       g_warning (error->message);
+                       g_error_free (error);
+               }
        }
+
+       g_object_unref (settings);
 }
 
 static void
@@ -2276,13 +2309,15 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        GtkPrintPages  print_pages;
        const gchar   *file_format;
        
-       if (response != GTK_RESPONSE_OK) {
+       if (response == GTK_RESPONSE_CANCEL) {
                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)
@@ -2427,7 +2462,8 @@ ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
                GTK_PRINT_CAPABILITY_COLLATE |
                GTK_PRINT_CAPABILITY_REVERSE |
                GTK_PRINT_CAPABILITY_SCALE |
-               GTK_PRINT_CAPABILITY_GENERATE_PS;
+               GTK_PRINT_CAPABILITY_GENERATE_PS |
+               GTK_PRINT_CAPABILITY_PREVIEW;
        
        if (EV_IS_FILE_EXPORTER (ev_window->priv->document) &&
            ev_file_exporter_format_supported (EV_FILE_EXPORTER (ev_window->priv->document),
@@ -4473,7 +4509,7 @@ register_custom_actions (EvWindow *window, GtkActionGroup *group)
        action = g_object_new (EPHY_TYPE_ZOOM_ACTION,
                               "name", ZOOM_CONTROL_ACTION,
                               "label", _("Zoom"),
-                              "stock_id", GTK_STOCK_ZOOM_IN,
+                              "stock_id", EV_STOCK_ZOOM,
                               "tooltip", _("Adjust the zoom level"),
                               "zoom", 1.0,
                               NULL);