]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Remove gs stuff from ps backend.
[evince.git] / shell / ev-window.c
index 4684f7996fbf7d3ff0b3cb35e8fdcee8a08cac7a..fe05cec093a29fbe0fc1b669fd90c026a92adc3b 100644 (file)
 #include "ev-image.h"
 #include "ev-message-area.h"
 
 #include "ev-image.h"
 #include "ev-message-area.h"
 
-#ifdef WITH_GNOME_PRINT
-#include "ev-print-job.h"
-#include <libgnomeprintui/gnome-print-dialog.h>
-#endif
-
-#ifdef WITH_GTK_PRINT
 #include <gtk/gtkprintunixdialog.h>
 #include <gtk/gtkprintunixdialog.h>
-#endif
 
 #ifdef ENABLE_PDF
 #include <poppler.h>
 
 #ifdef ENABLE_PDF
 #include <poppler.h>
@@ -128,9 +121,7 @@ struct _EvWindowPrivate {
 
        /* Dialogs */
        GtkWidget *properties;
 
        /* Dialogs */
        GtkWidget *properties;
-#ifdef WITH_PRINT
        GtkWidget *print_dialog;
        GtkWidget *print_dialog;
-#endif
        GtkWidget *password_dialog;
 
        /* UI Builders */
        GtkWidget *password_dialog;
 
        /* UI Builders */
@@ -174,21 +165,18 @@ struct _EvWindowPrivate {
        EvWindowPageMode page_mode;
        EvWindowTitle *title;
 
        EvWindowPageMode page_mode;
        EvWindowTitle *title;
 
-       EvJob *load_job;
-       EvJob *thumbnail_job;
-       EvJob *save_job;
-#ifdef WITH_GNOME_PRINT
-       GnomePrintJob *print_job;
-#endif
-
-#ifdef WITH_GTK_PRINT
+       EvJob            *load_job;
+       EvJob            *thumbnail_job;
+       EvJob            *save_job;
        EvJob            *print_job;
        EvJob            *print_job;
+
+       /* Printing */
        gboolean          print_preview;
        GtkPrintJob      *gtk_print_job;
        GtkPrinter       *printer;
        GtkPrintSettings *print_settings;
        GtkPageSetup     *print_page_setup;
        gboolean          print_preview;
        GtkPrintJob      *gtk_print_job;
        GtkPrinter       *printer;
        GtkPrintSettings *print_settings;
        GtkPageSetup     *print_page_setup;
-#endif
+
 };
 
 #define EV_WINDOW_GET_PRIVATE(object) \
 };
 
 #define EV_WINDOW_GET_PRIVATE(object) \
@@ -209,7 +197,6 @@ struct _EvWindowPrivate {
 #define THUMBNAILS_SIDEBAR_ID "thumbnails"
 #define ATTACHMENTS_SIDEBAR_ID "attachments"
 
 #define THUMBNAILS_SIDEBAR_ID "thumbnails"
 #define ATTACHMENTS_SIDEBAR_ID "attachments"
 
-#ifdef WITH_GTK_PRINT
 static const gchar *document_print_settings[] = {
        GTK_PRINT_SETTINGS_N_COPIES,
        GTK_PRINT_SETTINGS_COLLATE,
 static const gchar *document_print_settings[] = {
        GTK_PRINT_SETTINGS_N_COPIES,
        GTK_PRINT_SETTINGS_COLLATE,
@@ -220,7 +207,6 @@ static const gchar *document_print_settings[] = {
        GTK_PRINT_SETTINGS_PAGE_RANGES,
        GTK_PRINT_SETTINGS_PAGE_SET
 };
        GTK_PRINT_SETTINGS_PAGE_RANGES,
        GTK_PRINT_SETTINGS_PAGE_SET
 };
-#endif /* WITH_GTK_PRINT */
 
 static void    ev_window_update_actions                (EvWindow         *ev_window);
 static void     ev_window_sidebar_visibility_changed_cb (EvSidebar        *ev_sidebar,
 
 static void    ev_window_update_actions                (EvWindow         *ev_window);
 static void     ev_window_sidebar_visibility_changed_cb (EvSidebar        *ev_sidebar,
@@ -232,10 +218,8 @@ static void        ev_window_load_job_cb                   (EvJobLoad        *job,
                                                         gpointer          data);
 static void     ev_window_set_icon_from_thumbnail       (EvJobThumbnail   *job,
                                                         EvWindow         *ev_window);
                                                         gpointer          data);
 static void     ev_window_set_icon_from_thumbnail       (EvJobThumbnail   *job,
                                                         EvWindow         *ev_window);
-#ifdef WITH_GTK_PRINT
 static void     ev_window_print_job_cb                  (EvJobPrint       *job,
                                                         EvWindow         *window);
 static void     ev_window_print_job_cb                  (EvJobPrint       *job,
                                                         EvWindow         *window);
-#endif
 static void     ev_window_save_job_cb                   (EvJobSave        *save,
                                                         EvWindow         *window);
 static void     ev_window_sizing_mode_changed_cb        (EvView           *view,
 static void     ev_window_save_job_cb                   (EvJobSave        *save,
                                                         EvWindow         *window);
 static void     ev_window_sizing_mode_changed_cb        (EvView           *view,
@@ -247,11 +231,13 @@ static void     ev_window_zoom_changed_cb                 (EvView           *view,
 static void     ev_window_add_recent                    (EvWindow         *window,
                                                         const char       *filename);
 static void     ev_window_run_fullscreen                (EvWindow         *window);
 static void     ev_window_add_recent                    (EvWindow         *window,
                                                         const char       *filename);
 static void     ev_window_run_fullscreen                (EvWindow         *window);
-static void     ev_window_stop_fullscreen               (EvWindow         *window);
+static void     ev_window_stop_fullscreen               (EvWindow         *window,
+                                                        gboolean          unfullscreen_window);
 static void     ev_window_cmd_view_fullscreen           (GtkAction        *action,
                                                         EvWindow         *window);
 static void     ev_window_run_presentation              (EvWindow         *window);
 static void     ev_window_cmd_view_fullscreen           (GtkAction        *action,
                                                         EvWindow         *window);
 static void     ev_window_run_presentation              (EvWindow         *window);
-static void     ev_window_stop_presentation             (EvWindow         *window);
+static void     ev_window_stop_presentation             (EvWindow         *window,
+                                                        gboolean          unfullscreen_window);
 static void     ev_window_cmd_view_presentation         (GtkAction        *action,
                                                         EvWindow         *window);
 static void     ev_window_run_preview                   (EvWindow         *window);
 static void     ev_window_cmd_view_presentation         (GtkAction        *action,
                                                         EvWindow         *window);
 static void     ev_window_run_preview                   (EvWindow         *window);
@@ -281,6 +267,7 @@ static void     ev_window_cmd_edit_find                 (GtkAction        *actio
 static void     find_bar_search_changed_cb              (EggFindBar       *find_bar,
                                                         GParamSpec       *param,
                                                         EvWindow         *ev_window);
 static void     find_bar_search_changed_cb              (EggFindBar       *find_bar,
                                                         GParamSpec       *param,
                                                         EvWindow         *ev_window);
+static void     ev_window_do_preview_print              (EvWindow         *window);
 
 G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
 
 
 G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
 
@@ -353,24 +340,13 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        if (gconf_client_get_bool (client, GCONF_LOCKDOWN_PRINT, NULL)) {
                ok_to_print = FALSE;
        }
        if (gconf_client_get_bool (client, GCONF_LOCKDOWN_PRINT, NULL)) {
                ok_to_print = FALSE;
        }
-#ifndef WITH_PRINT
-       ok_to_print = FALSE;
-#endif
-       g_object_unref (client);
 
 
+       g_object_unref (client);
 
        /* File menu */
        ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document);
        ev_window_set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy);
 
        /* File menu */
        ev_window_set_action_sensitive (ev_window, "FileOpenCopy", has_document);
        ev_window_set_action_sensitive (ev_window, "FileSaveAs", has_document && ok_to_copy);
-
-#ifdef WITH_GTK_PRINT
        ev_window_set_action_sensitive (ev_window, "FilePrintSetup", has_pages && ok_to_print);
        ev_window_set_action_sensitive (ev_window, "FilePrintSetup", has_pages && ok_to_print);
-#endif
-
-#ifdef WITH_GNOME_PRINT
-       ev_window_set_action_sensitive (ev_window, "FilePrintSetup", FALSE);
-#endif
-       
        ev_window_set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print);
        ev_window_set_action_sensitive (ev_window, "FileProperties", has_document && has_properties);
 
        ev_window_set_action_sensitive (ev_window, "FilePrint", has_pages && ok_to_print);
        ev_window_set_action_sensitive (ev_window, "FileProperties", has_document && has_properties);
 
@@ -1303,7 +1279,7 @@ ev_window_clear_temp_file (EvWindow *ev_window)
        file = g_file_new_for_uri (ev_window->priv->uri);
        tempdir = g_file_new_for_path (g_get_tmp_dir ());
 
        file = g_file_new_for_uri (ev_window->priv->uri);
        tempdir = g_file_new_for_path (g_get_tmp_dir ());
 
-       if (g_file_contains_file (tempdir, file)) {
+       if (g_file_has_prefix (file, tempdir)) {
                g_file_delete (file, NULL, NULL);
        }
 
                g_file_delete (file, NULL, NULL);
        }
 
@@ -1441,17 +1417,9 @@ ev_window_close_dialogs (EvWindow *ev_window)
                gtk_widget_destroy (ev_window->priv->password_dialog);
        ev_window->priv->password_dialog = NULL;
        
                gtk_widget_destroy (ev_window->priv->password_dialog);
        ev_window->priv->password_dialog = NULL;
        
-#ifdef WITH_PRINT
        if (ev_window->priv->print_dialog)
                gtk_widget_destroy (ev_window->priv->print_dialog);
        ev_window->priv->print_dialog = NULL;
        if (ev_window->priv->print_dialog)
                gtk_widget_destroy (ev_window->priv->print_dialog);
        ev_window->priv->print_dialog = NULL;
-#endif
-
-#ifdef WITH_GNOME_PRINT
-       if (ev_window->priv->print_job)
-               g_object_unref (ev_window->priv->print_job);
-       ev_window->priv->print_job = NULL;
-#endif
        
        if (ev_window->priv->properties)
                gtk_widget_destroy (ev_window->priv->properties);
        
        if (ev_window->priv->properties)
                gtk_widget_destroy (ev_window->priv->properties);
@@ -1463,11 +1431,64 @@ window_open_file_copy_ready_cb (GFile        *source,
                                GAsyncResult *async_result,
                                EvWindow     *ev_window)
 {
                                GAsyncResult *async_result,
                                EvWindow     *ev_window)
 {
-       g_file_copy_finish (source, async_result, NULL);
-       ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
+       GError *error = NULL;
+       
+       g_file_copy_finish (source, async_result, &error);
+       if (!error) {
+               ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
+               g_object_unref (source);
+               
+               return;
+       }
+
+       if (error->domain == G_IO_ERROR &&
+           error->code == G_IO_ERROR_NOT_MOUNTED) {
+               /* TODO: try to mount */
+       }
+
+       ev_view_set_loading (EV_VIEW (ev_window->priv->view), FALSE);
+       ev_window->priv->in_reload = FALSE;
+       ev_window_error_message (GTK_WINDOW (ev_window),
+                                _("Unable to open document"),
+                                error);
+       g_free (ev_window->priv->local_uri);
+       ev_window->priv->local_uri = NULL;
+       
+       g_error_free (error);
        g_object_unref (source);
 }
 
        g_object_unref (source);
 }
 
+static void
+ev_window_load_file_remote (EvWindow  *ev_window,
+                           GFile     *source_file)
+{
+       GFile *target_file;
+       
+       if (!ev_window->priv->local_uri) {
+               gchar *tmp_name;
+               gchar *base_name;
+
+               /* We'd like to keep extension of source uri since
+                * it helps to resolve some mime types, say cbz */
+               tmp_name = ev_tmp_filename (NULL);
+               base_name = g_file_get_basename (source_file);
+               ev_window->priv->local_uri = g_strconcat ("file:", tmp_name, "-",
+                                                         base_name, NULL);
+               ev_job_load_set_uri (EV_JOB_LOAD (ev_window->priv->load_job),
+                                    ev_window->priv->local_uri);
+               g_free (base_name);
+               g_free (tmp_name);
+       }
+       
+       target_file = g_file_new_for_uri (ev_window->priv->local_uri);
+       g_file_copy_async (source_file, target_file,
+                          0, G_PRIORITY_DEFAULT, NULL,
+                          NULL, NULL, /* no progress callback */
+                          (GAsyncReadyCallback) window_open_file_copy_ready_cb,
+                          ev_window);
+       g_object_unref (target_file);
+}
+
 void
 ev_window_open_uri (EvWindow       *ev_window,
                    const char     *uri,
 void
 ev_window_open_uri (EvWindow       *ev_window,
                    const char     *uri,
@@ -1478,7 +1499,6 @@ ev_window_open_uri (EvWindow       *ev_window,
                    const gchar    *print_settings)
 {
        GFile *source_file;
                    const gchar    *print_settings)
 {
        GFile *source_file;
-       GFile *target_file;
 
        if (ev_window->priv->uri &&
            g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0) {
 
        if (ev_window->priv->uri &&
            g_ascii_strcasecmp (ev_window->priv->uri, uri) == 0) {
@@ -1512,33 +1532,11 @@ ev_window_open_uri (EvWindow       *ev_window,
 
        source_file = g_file_new_for_uri (uri);
        if (!g_file_is_native (source_file) && !ev_window->priv->local_uri) {
 
        source_file = g_file_new_for_uri (uri);
        if (!g_file_is_native (source_file) && !ev_window->priv->local_uri) {
-               char *tmp_name;
-               char *base_name;
-
-               /* We'd like to keep extension of source uri since
-                * it helps to resolve some mime types, say cbz */
-
-               tmp_name = ev_tmp_filename (NULL);
-               base_name = g_file_get_basename (source_file);
-               ev_window->priv->local_uri = g_strconcat ("file:", tmp_name, "-", base_name, NULL);
-               ev_job_load_set_uri (EV_JOB_LOAD (ev_window->priv->load_job),
-                                    ev_window->priv->local_uri);
-               g_free (base_name);
-               g_free (tmp_name);
-               
-               target_file = g_file_new_for_uri (ev_window->priv->local_uri);
-
-               g_file_copy_async (source_file, target_file,
-                                  0, G_PRIORITY_DEFAULT, NULL,
-                                  NULL, NULL, /* no progress callback */
-                                  (GAsyncReadyCallback) window_open_file_copy_ready_cb,
-                                  ev_window);
-               g_object_unref (target_file);
-               return;
+               ev_window_load_file_remote (ev_window, source_file);
+       } else {
+               g_object_unref (source_file);
+               ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
        }
        }
-
-       g_object_unref (source_file);
-       ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
 }
 
 static void
 }
 
 static void
@@ -2031,7 +2029,6 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
        gtk_widget_show (fc);
 }
 
        gtk_widget_show (fc);
 }
 
-#ifdef WITH_GTK_PRINT
 static void
 ev_window_print_page_setup_done_cb (GtkPageSetup *page_setup,
                                    EvWindow     *window)
 static void
 ev_window_print_page_setup_done_cb (GtkPageSetup *page_setup,
                                    EvWindow     *window)
@@ -2044,22 +2041,18 @@ ev_window_print_page_setup_done_cb (GtkPageSetup *page_setup,
                g_object_unref (window->priv->print_page_setup);
        window->priv->print_page_setup = g_object_ref (page_setup);
 }
                g_object_unref (window->priv->print_page_setup);
        window->priv->print_page_setup = g_object_ref (page_setup);
 }
-#endif /* WITH_GTK_PRINT */
 
 static void
 ev_window_cmd_file_print_setup (GtkAction *action, EvWindow *ev_window)
 {
 
 static void
 ev_window_cmd_file_print_setup (GtkAction *action, EvWindow *ev_window)
 {
-#ifdef WITH_GTK_PRINT
        gtk_print_run_page_setup_dialog_async (
                GTK_WINDOW (ev_window),
                ev_window->priv->print_page_setup,
                ev_window->priv->print_settings,
                (GtkPageSetupDoneFunc) ev_window_print_page_setup_done_cb,
                ev_window);
        gtk_print_run_page_setup_dialog_async (
                GTK_WINDOW (ev_window),
                ev_window->priv->print_page_setup,
                ev_window->priv->print_settings,
                (GtkPageSetupDoneFunc) ev_window_print_page_setup_done_cb,
                ev_window);
-#endif /* WITH_GTK_PRINT */
 }
 
 }
 
-#ifdef WITH_GTK_PRINT
 static void
 ev_window_clear_print_job (EvWindow *window)
 {
 static void
 ev_window_clear_print_job (EvWindow *window)
 {
@@ -2259,7 +2252,8 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        GtkPrintPages  print_pages;
        const gchar   *file_format;
        
        GtkPrintPages  print_pages;
        const gchar   *file_format;
        
-       if (response == GTK_RESPONSE_CANCEL) {
+       if (response != GTK_RESPONSE_OK &&
+           response != GTK_RESPONSE_APPLY) {
                gtk_widget_destroy (GTK_WIDGET (dialog));
                window->priv->print_dialog = NULL;
 
                gtk_widget_destroy (GTK_WIDGET (dialog));
                window->priv->print_dialog = NULL;
 
@@ -2442,124 +2436,6 @@ ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
 
        gtk_widget_show (dialog);
 }
 
        gtk_widget_show (dialog);
 }
-#endif /* WITH_GTK_PRINT */
-
-#ifdef WITH_GNOME_PRINT
-static gboolean
-ev_window_print_dialog_response_cb (GtkDialog *print_dialog,
-                                   gint       response,
-                                   EvWindow  *ev_window)
-{
-       EvPrintJob *print_job;
-       GnomePrintConfig *config;
-    
-       if (response != GNOME_PRINT_DIALOG_RESPONSE_PRINT) {
-               gtk_widget_destroy (GTK_WIDGET (print_dialog));
-               ev_window->priv->print_dialog = NULL;
-               g_object_unref (ev_window->priv->print_job);
-               ev_window->priv->print_job = NULL;
-               
-               return FALSE;
-       }
-
-       config = gnome_print_dialog_get_config (GNOME_PRINT_DIALOG (print_dialog));
-
-       /* FIXME: Change this when we have the first backend
-        * that can print more than postscript
-        */
-       if (using_pdf_printer (config)) {
-               GtkWidget *dialog;
-               
-               dialog = gtk_message_dialog_new (GTK_WINDOW (print_dialog), GTK_DIALOG_MODAL,
-                                                GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
-                                                _("Generating PDF is not supported"));
-               gtk_dialog_run (GTK_DIALOG (dialog));
-               gtk_widget_destroy (dialog);
-               
-               return FALSE;
-       } else if (!using_postscript_printer (config)) {
-               GtkWidget *dialog;
-
-               dialog = gtk_message_dialog_new (GTK_WINDOW (print_dialog), GTK_DIALOG_MODAL,
-                                                GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
-                                                _("Printing is not supported on this printer."));
-               gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
-                                                         _("You were trying to print to a printer using the “%s” driver. "
-                                                           "This program requires a PostScript printer driver."),
-                                                         gnome_print_config_get (config, (guchar *)"Settings.Engine.Backend.Driver"));
-               gtk_dialog_run (GTK_DIALOG (dialog));
-               gtk_widget_destroy (dialog);
-               
-               return FALSE;
-       }
-
-       save_print_config_to_file (config);
-    
-       print_job = g_object_new (EV_TYPE_PRINT_JOB,
-                                 "gnome_print_job", ev_window->priv->print_job,
-                                 "document", ev_window->priv->document,
-                                 "print_dialog", print_dialog,
-                                 NULL);
-
-       if (print_job != NULL) {
-               ev_print_job_print (print_job, GTK_WINDOW (ev_window));
-               g_object_unref (print_job);
-       }
-
-       g_object_unref (config);
-
-       gtk_widget_destroy (GTK_WIDGET (print_dialog));
-       ev_window->priv->print_dialog = NULL;
-       g_object_unref (ev_window->priv->print_job);
-       ev_window->priv->print_job = NULL;
-
-       return FALSE;
-}
-
-void
-ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
-{
-       GnomePrintConfig *config;
-       gchar *pages_label;
-
-        g_return_if_fail (EV_IS_WINDOW (ev_window));
-       g_return_if_fail (ev_window->priv->document != NULL);
-
-       config = load_print_config_from_file ();
-
-       if (ev_window->priv->print_job == NULL)
-               ev_window->priv->print_job = gnome_print_job_new (config);
-       
-       if (ev_window->priv->print_dialog == NULL) {
-               ev_window->priv->print_dialog =
-                       gnome_print_dialog_new (ev_window->priv->print_job,
-                                               (guchar *) _("Print"),
-                                               (GNOME_PRINT_DIALOG_RANGE |
-                                                GNOME_PRINT_DIALOG_COPIES));
-       }
-       
-       gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->print_dialog),
-                                     GTK_WINDOW (ev_window));                                                          
-       g_object_unref (config);                                                                
-
-       pages_label = g_strconcat (_("Pages"), " ", NULL);
-       gnome_print_dialog_construct_range_page (GNOME_PRINT_DIALOG (ev_window->priv->print_dialog),
-                                                GNOME_PRINT_RANGE_ALL |
-                                                GNOME_PRINT_RANGE_RANGE,
-                                                first_page, last_page,
-                                                NULL, (const guchar *)pages_label);
-       g_free (pages_label);
-                                                
-       gtk_dialog_set_response_sensitive (GTK_DIALOG (ev_window->priv->print_dialog),
-                                          GNOME_PRINT_DIALOG_RESPONSE_PREVIEW,
-                                          FALSE);
-
-       g_signal_connect (G_OBJECT (ev_window->priv->print_dialog), "response",
-                         G_CALLBACK (ev_window_print_dialog_response_cb),
-                         ev_window);
-       gtk_widget_show (ev_window->priv->print_dialog);
-}
-#endif /* WITH_GNOME_PRINT */
 
 static void
 ev_window_print (EvWindow *window)
 
 static void
 ev_window_print (EvWindow *window)
@@ -2570,9 +2446,7 @@ ev_window_print (EvWindow *window)
        page_cache = ev_page_cache_get (window->priv->document);
        last_page = ev_page_cache_get_n_pages (page_cache);
 
        page_cache = ev_page_cache_get (window->priv->document);
        last_page = ev_page_cache_get_n_pages (page_cache);
 
-#ifdef WITH_PRINT
        ev_window_print_range (window, 1, last_page);
        ev_window_print_range (window, 1, last_page);
-#endif
 }
 
 static void
 }
 
 static void
@@ -2638,7 +2512,7 @@ ev_window_cmd_continuous (GtkAction *action, EvWindow *ev_window)
 {
        gboolean continuous;
 
 {
        gboolean continuous;
 
-       ev_window_stop_presentation (ev_window);
+       ev_window_stop_presentation (ev_window, TRUE);
        continuous = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        g_object_set (G_OBJECT (ev_window->priv->view),
                      "continuous", continuous,
        continuous = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        g_object_set (G_OBJECT (ev_window->priv->view),
                      "continuous", continuous,
@@ -2651,7 +2525,7 @@ ev_window_cmd_dual (GtkAction *action, EvWindow *ev_window)
 {
        gboolean dual_page;
 
 {
        gboolean dual_page;
 
-       ev_window_stop_presentation (ev_window);
+       ev_window_stop_presentation (ev_window, TRUE);
        dual_page = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        g_object_set (G_OBJECT (ev_window->priv->view),
                      "dual-page", dual_page,
        dual_page = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        g_object_set (G_OBJECT (ev_window->priv->view),
                      "dual-page", dual_page,
@@ -2662,7 +2536,7 @@ ev_window_cmd_dual (GtkAction *action, EvWindow *ev_window)
 static void
 ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window)
 {
 static void
 ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window)
 {
-       ev_window_stop_presentation (ev_window);
+       ev_window_stop_presentation (ev_window, TRUE);
 
        if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
                ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_BEST_FIT);
 
        if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
                ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_BEST_FIT);
@@ -2675,7 +2549,7 @@ ev_window_cmd_view_best_fit (GtkAction *action, EvWindow *ev_window)
 static void
 ev_window_cmd_view_page_width (GtkAction *action, EvWindow *ev_window)
 {
 static void
 ev_window_cmd_view_page_width (GtkAction *action, EvWindow *ev_window)
 {
-       ev_window_stop_presentation (ev_window);
+       ev_window_stop_presentation (ev_window, TRUE);
 
        if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
                ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FIT_WIDTH);
 
        if (gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action))) {
                ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), EV_SIZING_FIT_WIDTH);
@@ -2804,6 +2678,12 @@ fullscreen_toolbar_remove_shadow (GtkWidget *toolbar)
 static void
 ev_window_run_fullscreen (EvWindow *window)
 {
 static void
 ev_window_run_fullscreen (EvWindow *window)
 {
+       EvView  *view = EV_VIEW (window->priv->view);
+       gboolean fullscreen_window = TRUE;
+
+       if (ev_view_get_fullscreen (view))
+               return;
+       
        if (!window->priv->fullscreen_toolbar) {
                window->priv->fullscreen_toolbar =
                        gtk_ui_manager_get_widget (window->priv->ui_manager,
        if (!window->priv->fullscreen_toolbar) {
                window->priv->fullscreen_toolbar =
                        gtk_ui_manager_get_widget (window->priv->ui_manager,
@@ -2821,11 +2701,16 @@ ev_window_run_fullscreen (EvWindow *window)
                                       window->priv->fullscreen_toolbar, 1);
        }
 
                                       window->priv->fullscreen_toolbar, 1);
        }
 
+       if (ev_view_get_presentation (view)) {
+               ev_window_stop_presentation (window, FALSE);
+               fullscreen_window = FALSE;
+       }
+
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_NONE,
                      NULL);
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_NONE,
                      NULL);
 
-       ev_view_set_fullscreen (EV_VIEW (window->priv->view), TRUE);
+       ev_view_set_fullscreen (view, TRUE);
        ev_window_update_fullscreen_action (window);
 
        /* If the user doesn't have the main toolbar he/she won't probably want
        ev_window_update_fullscreen_action (window);
 
        /* If the user doesn't have the main toolbar he/she won't probably want
@@ -2834,8 +2719,9 @@ ev_window_run_fullscreen (EvWindow *window)
        update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR,
                            (window->priv->chrome & EV_CHROME_TOOLBAR) != 0);
        update_chrome_visibility (window);
        update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR,
                            (window->priv->chrome & EV_CHROME_TOOLBAR) != 0);
        update_chrome_visibility (window);
-       
-       gtk_window_fullscreen (GTK_WINDOW (window));
+
+       if (fullscreen_window)
+               gtk_window_fullscreen (GTK_WINDOW (window));
        gtk_widget_grab_focus (window->priv->view);
 
        if (!ev_window_is_empty (window))
        gtk_widget_grab_focus (window->priv->view);
 
        if (!ev_window_is_empty (window))
@@ -2843,11 +2729,12 @@ ev_window_run_fullscreen (EvWindow *window)
 }
 
 static void
 }
 
 static void
-ev_window_stop_fullscreen (EvWindow *window)
+ev_window_stop_fullscreen (EvWindow *window,
+                          gboolean  unfullscreen_window)
 {
        EvView *view = EV_VIEW (window->priv->view);
 
 {
        EvView *view = EV_VIEW (window->priv->view);
 
-       if (!ev_view_get_fullscreen (EV_VIEW (view)))
+       if (!ev_view_get_fullscreen (view))
                return;
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                return;
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
@@ -2858,7 +2745,8 @@ ev_window_stop_fullscreen (EvWindow *window)
        ev_window_update_fullscreen_action (window);
        update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, FALSE);
        update_chrome_visibility (window);
        ev_window_update_fullscreen_action (window);
        update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, FALSE);
        update_chrome_visibility (window);
-       gtk_window_unfullscreen (GTK_WINDOW (window));
+       if (unfullscreen_window)
+               gtk_window_unfullscreen (GTK_WINDOW (window));
 
        if (!ev_window_is_empty (window))
                ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE);
 
        if (!ev_window_is_empty (window))
                ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE);
@@ -2869,14 +2757,11 @@ ev_window_cmd_view_fullscreen (GtkAction *action, EvWindow *window)
 {
        gboolean fullscreen;
 
 {
        gboolean fullscreen;
 
-        g_return_if_fail (EV_IS_WINDOW (window));
-       ev_window_stop_presentation (window);
-
        fullscreen = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        if (fullscreen) {
                ev_window_run_fullscreen (window);
        } else {
        fullscreen = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        if (fullscreen) {
                ev_window_run_fullscreen (window);
        } else {
-               ev_window_stop_fullscreen (window);
+               ev_window_stop_fullscreen (window, TRUE);
        }
 }
 
        }
 }
 
@@ -2961,17 +2846,29 @@ ev_window_update_presentation_action (EvWindow *window)
 static void
 ev_window_run_presentation (EvWindow *window)
 {
 static void
 ev_window_run_presentation (EvWindow *window)
 {
+       EvView  *view = EV_VIEW (window->priv->view);
+       gboolean fullscreen_window = TRUE;
+
+       if (ev_view_get_presentation (view))
+               return;
+
+       if (ev_view_get_fullscreen (view)) {
+               ev_window_stop_fullscreen (window, FALSE);
+               fullscreen_window = FALSE;
+       }
+       
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_NONE,
                      NULL);
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                      "shadow-type", GTK_SHADOW_NONE,
                      NULL);
 
-       ev_view_set_presentation (EV_VIEW (window->priv->view), TRUE);
+       ev_view_set_presentation (view, TRUE);
        ev_window_update_presentation_action (window);
 
        update_chrome_visibility (window);
        
        gtk_widget_grab_focus (window->priv->view);
        ev_window_update_presentation_action (window);
 
        update_chrome_visibility (window);
        
        gtk_widget_grab_focus (window->priv->view);
-       gtk_window_fullscreen (GTK_WINDOW (window));
+       if (fullscreen_window)
+               gtk_window_fullscreen (GTK_WINDOW (window));
 
        g_signal_connect (window->priv->view,
                          "motion-notify-event",
 
        g_signal_connect (window->priv->view,
                          "motion-notify-event",
@@ -2990,9 +2887,12 @@ ev_window_run_presentation (EvWindow *window)
 }
 
 static void
 }
 
 static void
-ev_window_stop_presentation (EvWindow *window)
+ev_window_stop_presentation (EvWindow *window,
+                            gboolean  unfullscreen_window)
 {
 {
-       if (!ev_view_get_presentation (EV_VIEW (window->priv->view)))
+       EvView *view = EV_VIEW (window->priv->view);
+       
+       if (!ev_view_get_presentation (view))
                return;
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
                return;
 
        g_object_set (G_OBJECT (window->priv->scrolled_window),
@@ -3002,7 +2902,8 @@ ev_window_stop_presentation (EvWindow *window)
        ev_view_set_presentation (EV_VIEW (window->priv->view), FALSE);
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
        ev_view_set_presentation (EV_VIEW (window->priv->view), FALSE);
        ev_window_update_presentation_action (window);
        update_chrome_visibility (window);
-       gtk_window_unfullscreen (GTK_WINDOW (window));
+       if (unfullscreen_window)
+               gtk_window_unfullscreen (GTK_WINDOW (window));
 
        g_signal_handlers_disconnect_by_func (window->priv->view,
                                              (gpointer) presentation_motion_notify_cb,
 
        g_signal_handlers_disconnect_by_func (window->priv->view,
                                              (gpointer) presentation_motion_notify_cb,
@@ -3023,14 +2924,11 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window)
 {
        gboolean presentation;
 
 {
        gboolean presentation;
 
-       g_return_if_fail (EV_IS_WINDOW (window));
-       ev_window_stop_fullscreen (window);
-
        presentation = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        if (presentation) {
                ev_window_run_presentation (window);
        } else {
        presentation = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
        if (presentation) {
                ev_window_run_presentation (window);
        } else {
-               ev_window_stop_presentation (window);
+               ev_window_stop_presentation (window, TRUE);
        }
 }
 
        }
 }
 
@@ -3328,19 +3226,15 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
 static void
 ev_window_cmd_leave_fullscreen (GtkAction *action, EvWindow *window)
 {
 static void
 ev_window_cmd_leave_fullscreen (GtkAction *action, EvWindow *window)
 {
-       ev_window_stop_fullscreen (window);
+       ev_window_stop_fullscreen (window, TRUE);
 }
 
 static void
 ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window)
 {
 }
 
 static void
 ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window)
 {
-       ev_window_stop_fullscreen (window);
        ev_window_run_presentation (window);
 }
 
        ev_window_run_presentation (window);
 }
 
-#ifdef WITH_GTK_PRINT
-static void ev_window_do_preview_print (EvWindow *window);
-
 static gboolean
 ev_window_enumerate_printer_cb (GtkPrinter *printer,
                                EvWindow   *window)
 static gboolean
 ev_window_enumerate_printer_cb (GtkPrinter *printer,
                                EvWindow   *window)
@@ -3432,12 +3326,9 @@ ev_window_do_preview_print (EvWindow *window)
        gtk_widget_hide (GTK_WIDGET (window));
 }
 
        gtk_widget_hide (GTK_WIDGET (window));
 }
 
-#endif /* WITH_GTK_PRINT */
-
 static void
 ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
 {
 static void
 ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
 {
-#ifdef WITH_GTK_PRINT
        EvWindowPrivate *priv = window->priv;
        GtkPrintSettings *print_settings = NULL;
 #if GTK_CHECK_VERSION (2, 11, 0)
        EvWindowPrivate *priv = window->priv;
        GtkPrintSettings *print_settings = NULL;
 #if GTK_CHECK_VERSION (2, 11, 0)
@@ -3468,7 +3359,6 @@ ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
 
        gtk_enumerate_printers ((GtkPrinterFunc) ev_window_enumerate_printer_cb,
                                window, NULL, FALSE);
 
        gtk_enumerate_printers ((GtkPrinterFunc) ev_window_enumerate_printer_cb,
                                window, NULL, FALSE);
-#endif /* WITH_GTK_PRINT */
 }
 
 static void
 }
 
 static void
@@ -3493,9 +3383,9 @@ ev_window_cmd_escape (GtkAction *action, EvWindow *window)
                              NULL);
 
                if (fullscreen) {
                              NULL);
 
                if (fullscreen) {
-                       ev_window_stop_fullscreen (window);
+                       ev_window_stop_fullscreen (window, TRUE);
                } else if (presentation) {
                } else if (presentation) {
-                       ev_window_stop_presentation (window);
+                       ev_window_stop_presentation (window, TRUE);
                        gtk_widget_grab_focus (window->priv->view);
                } else {
                        gtk_widget_grab_focus (window->priv->view);
                        gtk_widget_grab_focus (window->priv->view);
                } else {
                        gtk_widget_grab_focus (window->priv->view);
@@ -3975,6 +3865,7 @@ static void
 find_bar_close_cb (EggFindBar *find_bar,
                   EvWindow   *ev_window)
 {
 find_bar_close_cb (EggFindBar *find_bar,
                   EvWindow   *ev_window)
 {
+       ev_view_find_cancel (EV_VIEW (ev_window->priv->view));
        update_chrome_flag (ev_window, EV_CHROME_FINDBAR, FALSE);
        update_chrome_visibility (ev_window);
 }
        update_chrome_flag (ev_window, EV_CHROME_FINDBAR, FALSE);
        update_chrome_visibility (ev_window);
 }
@@ -4165,8 +4056,6 @@ ev_window_dispose (GObject *object)
        }
        
        ev_window_close_dialogs (window);
        }
        
        ev_window_close_dialogs (window);
-
-#ifdef WITH_GTK_PRINT
        ev_window_clear_print_job (window);
 
        if (window->priv->gtk_print_job) {
        ev_window_clear_print_job (window);
 
        if (window->priv->gtk_print_job) {
@@ -4188,7 +4077,6 @@ ev_window_dispose (GObject *object)
                g_object_unref (window->priv->print_page_setup);
                window->priv->print_page_setup = NULL;
        }
                g_object_unref (window->priv->print_page_setup);
                window->priv->print_page_setup = NULL;
        }
-#endif
 
        if (priv->link) {
                g_object_unref (priv->link);
 
        if (priv->link) {
                g_object_unref (priv->link);
@@ -4744,29 +4632,11 @@ static void
 launch_external_uri (EvWindow *window, EvLinkAction *action)
 {
        const gchar *uri = ev_link_action_get_uri (action);
 launch_external_uri (EvWindow *window, EvLinkAction *action)
 {
        const gchar *uri = ev_link_action_get_uri (action);
-       const char *content_type;
-       GFile *file;
-       GFileInfo *file_info;
-       GAppInfo *app;
-       GList *file_list = NULL;
        GError *error = NULL;
        GError *error = NULL;
+       gboolean ret;
        
        
-       file = g_file_new_for_uri (uri);
-       file_info = g_file_query_info (file,
-                                      G_FILE_ATTRIBUTE_STANDARD_CONTENT_TYPE,
-                                      0, NULL, NULL);
-       if (file_info == NULL) {
-               g_object_unref (file);
-               return;
-       }
-       
-       content_type = g_file_info_get_content_type (file_info);
-       app = g_app_info_get_default_for_type (content_type, TRUE);
-       g_object_unref (file_info);
-       
-       file_list = g_list_append (file_list, file);
-       
-       if (!g_app_info_launch (app, file_list, NULL, &error)) {
+       ret = g_app_info_launch_default_for_uri (uri, NULL, &error);
+       if (ret == FALSE) {
                GtkWidget *dialog;
        
                dialog = gtk_message_dialog_new (GTK_WINDOW (window),
                GtkWidget *dialog;
        
                dialog = gtk_message_dialog_new (GTK_WINDOW (window),
@@ -4780,11 +4650,8 @@ launch_external_uri (EvWindow *window, EvLinkAction *action)
                                  G_CALLBACK (gtk_widget_destroy),
                                  NULL);
                gtk_widget_show (dialog);
                                  G_CALLBACK (gtk_widget_destroy),
                                  NULL);
                gtk_widget_show (dialog);
+               g_error_free(error);
        }
        }
-
-       g_object_unref (app);
-       g_object_unref (file);
-       g_list_free (file_list);
 }
 
 static void
 }
 
 static void
@@ -4921,7 +4788,6 @@ image_save_dialog_response_cb (GtkWidget *fc,
        GError          *error = NULL;
        GdkPixbuf       *pixbuf;
        gchar           *uri;
        GError          *error = NULL;
        GdkPixbuf       *pixbuf;
        gchar           *uri;
-       gchar           *uri_extension;
        gchar          **extensions;
        gchar           *filename;
        gchar           *file_format;
        gchar          **extensions;
        gchar           *filename;
        gchar           *file_format;
@@ -4952,27 +4818,31 @@ image_save_dialog_response_cb (GtkWidget *fc,
        }
 
        extensions = gdk_pixbuf_format_get_extensions (format);
        }
 
        extensions = gdk_pixbuf_format_get_extensions (format);
-       uri_extension = g_strconcat (uri, ".", extensions[0], NULL);
+       if (g_str_has_suffix(uri, extensions[0])) {
+               gchar *uri_extension;
+               
+               uri_extension = g_strconcat (uri, ".", extensions[0], NULL);
+               target_file = g_file_new_for_uri (uri_extension);
+               g_free (uri_extension);
+       } else {
+               target_file = g_file_new_for_uri (uri);
+       }
        g_strfreev(extensions);
        g_strfreev(extensions);
-       file_format = gdk_pixbuf_format_get_name (format);
+       g_free (uri);
        
        
-       target_file = g_file_new_for_uri (uri_extension);
        is_native = g_file_is_native (target_file);
        is_native = g_file_is_native (target_file);
-       
        if (is_native) {
                filename = g_file_get_path (target_file);
        } else {
                filename = ev_tmp_filename ("saveimage");
        }
        if (is_native) {
                filename = g_file_get_path (target_file);
        } else {
                filename = ev_tmp_filename ("saveimage");
        }
-       
-       g_free (uri);
-       g_free (uri_extension);
 
        ev_document_doc_mutex_lock ();
        pixbuf = ev_document_images_get_image (EV_DOCUMENT_IMAGES (ev_window->priv->document),
                                               ev_window->priv->image);
        ev_document_doc_mutex_unlock ();
 
        ev_document_doc_mutex_lock ();
        pixbuf = ev_document_images_get_image (EV_DOCUMENT_IMAGES (ev_window->priv->document),
                                               ev_window->priv->image);
        ev_document_doc_mutex_unlock ();
-       
+
+       file_format = gdk_pixbuf_format_get_name (format);
        gdk_pixbuf_save (pixbuf, filename, file_format, &error, NULL);
        g_free (file_format);
        g_object_unref (pixbuf);
        gdk_pixbuf_save (pixbuf, filename, file_format, &error, NULL);
        g_free (file_format);
        g_object_unref (pixbuf);