]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
[shell] Remove left over GtkPrinter
[evince.git] / shell / ev-window.c
index 523a8c6aa164342bde35b792b2512eb5f026ef21..ded233d856375bc2e94316863e5088643f44bd68 100644 (file)
 #include <glib/gi18n.h>
 #include <gio/gio.h>
 #include <gtk/gtk.h>
-#if GTK_CHECK_VERSION (2, 14, 0)
-#include <gtk/gtkunixprint.h>
-#else
-#include <gtk/gtkprintunixdialog.h>
-#endif
+
+#ifdef WITH_GCONF
 #include <gconf/gconf-client.h>
+#endif
 
 #include "egg-editable-toolbar.h"
 #include "egg-toolbar-editor.h"
@@ -71,7 +69,6 @@
 #include "ev-jobs.h"
 #include "ev-message-area.h"
 #include "ev-metadata-manager.h"
-#include "ev-mount-operation.h"
 #include "ev-navigation-action.h"
 #include "ev-open-recent-action.h"
 #include "ev-page-action.h"
@@ -113,7 +110,6 @@ typedef enum {
        EV_CHROME_RAISE_TOOLBAR = 1 << 3,
        EV_CHROME_FULLSCREEN_TOOLBAR    = 1 << 4,
        EV_CHROME_SIDEBAR       = 1 << 5,
-       EV_CHROME_PREVIEW_TOOLBAR       = 1 << 6,
        EV_CHROME_NORMAL        = EV_CHROME_MENUBAR | EV_CHROME_TOOLBAR | EV_CHROME_SIDEBAR
 } EvChrome;
 
@@ -166,10 +162,6 @@ struct _EvWindowPrivate {
        /* Presentation mode */
        guint      presentation_timeout_id;
 
-       /* Preview mode */
-       GtkWidget *preview_toolbar;
-       gchar     *print_settings_file;
-
        /* Popup view */
        GtkWidget *view_popup;
        EvLink    *link;
@@ -183,7 +175,6 @@ struct _EvWindowPrivate {
        char *uri;
        glong uri_mtime;
        char *local_uri;
-       gboolean unlink_temp_file;
        gboolean in_reload;
        EvFileMonitor *monitor;
        guint setup_document_idle;
@@ -207,7 +198,6 @@ struct _EvWindowPrivate {
 
        /* Printing */
        GQueue           *print_queue;
-       GtkPrinter       *printer;
        GtkPrintSettings *print_settings;
        GtkPageSetup     *print_page_setup;
        gboolean          close_after_print;
@@ -277,7 +267,6 @@ static void     ev_window_stop_presentation             (EvWindow         *windo
                                                         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_view_popup_cmd_open_link             (GtkAction        *action,
                                                         EvWindow         *window);
 static void     ev_view_popup_cmd_open_link_new_window  (GtkAction        *action,
@@ -305,7 +294,6 @@ 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     ev_window_do_preview_print              (EvWindow         *window);
 static void     ev_window_load_file_remote              (EvWindow         *ev_window,
                                                         GFile            *source_file);
 static void     ev_window_media_player_key_pressed      (EvWindow         *window,
@@ -340,8 +328,9 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        gboolean can_get_text = FALSE;
        gboolean has_pages = FALSE;
        gboolean can_find = FALSE;
-
+#ifdef WITH_GCONF
        GConfClient *client;
+#endif
 
        if (document) {
                has_document = TRUE;
@@ -364,10 +353,12 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
                can_find = TRUE;
        }
 
+#ifdef WITH_GCONF
        client = gconf_client_get_default ();
        override_restrictions = gconf_client_get_bool (client, 
                                                       GCONF_OVERRIDE_RESTRICTIONS, 
                                                       NULL);
+#endif
        if (!override_restrictions && info && info->fields_mask & EV_DOCUMENT_INFO_PERMISSIONS) {
                ok_to_print = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_PRINT);
                ok_to_copy = (info->permissions & EV_DOCUMENT_PERMISSIONS_OK_TO_COPY);
@@ -376,7 +367,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        if (has_document && !EV_IS_FILE_EXPORTER(document))
                ok_to_print = FALSE;
 
-       
+#ifdef WITH_GCONF
        if (gconf_client_get_bool (client, GCONF_LOCKDOWN_SAVE, NULL)) {
                ok_to_copy = FALSE;
        }
@@ -386,11 +377,12 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        }
 
        g_object_unref (client);
+#endif
 
        /* 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);
-       ev_window_set_action_sensitive (ev_window, "FilePrintSetup", has_pages && ok_to_print);
+       ev_window_set_action_sensitive (ev_window, "FilePageSetup", has_pages && ok_to_print);
        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);
 
@@ -413,7 +405,6 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
        ev_window_set_action_sensitive (ev_window, PAGE_SELECTOR_ACTION, has_pages);
        ev_window_set_action_sensitive (ev_window, ZOOM_CONTROL_ACTION,  has_pages);
        ev_window_set_action_sensitive (ev_window, NAVIGATION_ACTION,  FALSE);
-       ev_window_set_action_sensitive (ev_window, "PreviewPrint", has_pages && ok_to_print);
 
         ev_window_update_actions (ev_window);
 }
@@ -443,6 +434,8 @@ ev_window_update_actions (EvWindow *ev_window)
                                        has_pages && can_find_in_page);
        ev_window_set_action_sensitive (ev_window, "EditFindPrevious",
                                        has_pages && can_find_in_page);
+        ev_window_set_action_sensitive (ev_window, "F3",
+                                        has_pages && can_find_in_page);
 
        presentation_mode = ev_view_get_presentation (view);
        
@@ -530,7 +523,6 @@ update_chrome_visibility (EvWindow *window)
        EvWindowPrivate *priv = window->priv;
        gboolean menubar, toolbar, findbar, fullscreen_toolbar, sidebar;
        gboolean fullscreen_mode, presentation, fullscreen;
-       gboolean preview_toolbar;
 
        presentation = ev_view_get_presentation (EV_VIEW (priv->view));
        fullscreen = ev_view_get_fullscreen (EV_VIEW (priv->view));
@@ -543,16 +535,12 @@ update_chrome_visibility (EvWindow *window)
                              (priv->chrome & EV_CHROME_RAISE_TOOLBAR) != 0) && fullscreen;
        findbar = (priv->chrome & EV_CHROME_FINDBAR) != 0;
        sidebar = (priv->chrome & EV_CHROME_SIDEBAR) != 0 && !presentation;
-       preview_toolbar = (priv->chrome& EV_CHROME_PREVIEW_TOOLBAR);
 
        set_widget_visibility (priv->menubar, menubar); 
        set_widget_visibility (priv->toolbar, toolbar);
        set_widget_visibility (priv->find_bar, findbar);
        set_widget_visibility (priv->sidebar, sidebar);
        
-       if (priv->preview_toolbar)
-               set_widget_visibility (priv->preview_toolbar, preview_toolbar);
-
        ev_window_set_action_sensitive (window, "EditToolbar", toolbar);
        gtk_widget_set_sensitive (priv->menubar, menubar);
 
@@ -881,29 +869,6 @@ update_document_mode (EvWindow *window, EvDocumentMode mode)
        }
 }
 
-static void
-setup_document_from_metadata (EvWindow *window)
-{
-       char *uri = window->priv->uri;
-       GValue page = { 0, };
-       gint n_pages;
-       gint new_page;
-
-       /* View the previously shown page, but make sure to not open a document on
-        * the last page, since closing it on the last page most likely means the
-        * user was finished reading the document. In that case, reopening should
-        * show the first page. */
-       if (uri && ev_metadata_manager_get (uri, "page", &page, TRUE)) {
-               n_pages = ev_page_cache_get_n_pages (window->priv->page_cache);
-               new_page = CLAMP (g_value_get_int (&page), 0, n_pages - 1);
-               if (!window->priv->in_reload && new_page == n_pages - 1)
-                       new_page = 0;
-               ev_page_cache_set_current_page (window->priv->page_cache,
-                                               new_page);
-               g_value_unset (&page);
-       }
-}
-
 static void
 setup_chrome_from_metadata (EvWindow *window)
 {
@@ -919,17 +884,18 @@ setup_chrome_from_metadata (EvWindow *window)
 }
 
 static void
-setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
+setup_sidebar_from_metadata (EvWindow *window)
 {
-       char *uri = window->priv->uri;
-       GtkWidget *sidebar = window->priv->sidebar;
-       GtkWidget *links = window->priv->sidebar_links;
-       GtkWidget *thumbs = window->priv->sidebar_thumbs;
-       GtkWidget *attachments = window->priv->sidebar_attachments;
-       GtkWidget *layers = window->priv->sidebar_layers;
-       GValue sidebar_size = { 0, };
-       GValue sidebar_page = { 0, };
-       GValue sidebar_visibility = { 0, };
+       gchar      *uri = window->priv->uri;
+       EvDocument *document = window->priv->document;
+       GtkWidget  *sidebar = window->priv->sidebar;
+       GtkWidget  *links = window->priv->sidebar_links;
+       GtkWidget  *thumbs = window->priv->sidebar_thumbs;
+       GtkWidget  *attachments = window->priv->sidebar_attachments;
+       GtkWidget  *layers = window->priv->sidebar_layers;
+       GValue      sidebar_size = { 0, };
+       GValue      sidebar_page = { 0, };
+       GValue      sidebar_visibility = { 0, };
 
        if (ev_metadata_manager_get (uri, "sidebar_size", &sidebar_size, FALSE)) {
                gtk_paned_set_position (GTK_PANED (window->priv->hpaned),
@@ -970,13 +936,77 @@ setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
 }
 
 static void
-setup_size_from_metadata (EvWindow *window)
+setup_document_from_metadata (EvWindow *window)
 {
-       char *uri = window->priv->uri;
+       gchar *uri = window->priv->uri;
+       GValue page = { 0, };
        GValue width = { 0, };
        GValue height = { 0, };
        GValue width_ratio = { 0, };
        GValue height_ratio = { 0, };
+
+       /* View the previously shown page, but make sure to not open a document on
+        * the last page, since closing it on the last page most likely means the
+        * user was finished reading the document. In that case, reopening should
+        * show the first page. */
+       if (uri && ev_metadata_manager_get (uri, "page", &page, TRUE)) {
+               gint n_pages;
+               gint new_page;
+               
+               n_pages = ev_page_cache_get_n_pages (window->priv->page_cache);
+               new_page = CLAMP (g_value_get_int (&page), 0, n_pages - 1);
+               ev_page_cache_set_current_page (window->priv->page_cache,
+                                               new_page);
+               g_value_unset (&page);
+       }
+
+       setup_sidebar_from_metadata (window);
+
+       if (ev_metadata_manager_get (uri, "window_width", &width, TRUE) &&
+           ev_metadata_manager_get (uri, "window_height", &height, TRUE))
+               return; /* size was already set in setup_size_from_metadata */
+
+       if (ev_metadata_manager_get (uri, "window_width_ratio", &width_ratio, FALSE) &&
+           ev_metadata_manager_get (uri, "window_height_ratio", &height_ratio, FALSE)) {
+               gint       document_width;
+               gint       document_height;
+               GdkScreen *screen;
+               gint       request_width;
+               gint       request_height;
+
+               ev_page_cache_get_max_width (window->priv->page_cache, 
+                                            0, 1.0,
+                                            &document_width);
+               ev_page_cache_get_max_height (window->priv->page_cache, 
+                                            0, 1.0,
+                                            &document_height);                 
+               
+               request_width = g_value_get_double (&width_ratio) * document_width;
+               request_height = g_value_get_double (&height_ratio) * document_height;
+               
+               screen = gtk_window_get_screen (GTK_WINDOW (window));
+               
+               if (screen) {
+                       request_width = MIN (request_width, gdk_screen_get_width (screen));
+                       request_height = MIN (request_width, gdk_screen_get_height (screen));
+               }
+               
+               if (request_width > 0 && request_height > 0) {
+                       gtk_window_resize (GTK_WINDOW (window),
+                                          request_width,
+                                          request_height);
+               }
+               g_value_unset (&width_ratio);
+               g_value_unset (&height_ratio);
+       }
+}
+
+static void
+setup_size_from_metadata (EvWindow *window)
+{
+       char *uri = window->priv->uri;
+       GValue width = { 0, };
+       GValue height = { 0, };
        GValue maximized = { 0, };
        GValue x = { 0, };
        GValue y = { 0, };
@@ -1007,43 +1037,6 @@ setup_size_from_metadata (EvWindow *window)
                                   g_value_get_int (&height));
                g_value_unset (&width);
                g_value_unset (&height);
-               return;
-       }
-
-        if (window->priv->page_cache &&
-           ev_metadata_manager_get (uri, "window_width_ratio", &width_ratio, FALSE) &&
-           ev_metadata_manager_get (uri, "window_height_ratio", &height_ratio, FALSE)) {
-               
-               gint document_width;
-               gint document_height;
-               
-               GdkScreen *screen;
-               
-               gint request_width;
-               gint request_height;
-
-               ev_page_cache_get_max_width (window->priv->page_cache, 
-                                            0, 1.0,
-                                            &document_width);
-               ev_page_cache_get_max_height (window->priv->page_cache, 
-                                            0, 1.0,
-                                            &document_height);                 
-               
-               request_width = g_value_get_double (&width_ratio) * document_width;
-               request_height = g_value_get_double (&height_ratio) * document_height;
-               
-               screen = gtk_window_get_screen (GTK_WINDOW (window));
-               
-               if (screen) {
-                       request_width = MIN (request_width, gdk_screen_get_width (screen));
-                       request_height = MIN (request_width, gdk_screen_get_height (screen));
-               }
-                               
-               gtk_window_resize (GTK_WINDOW (window),
-                                  request_width,
-                                  request_height);
-               g_value_unset (&width_ratio);
-               g_value_unset (&height_ratio);
        }
 }
 
@@ -1051,7 +1044,7 @@ static void
 setup_view_from_metadata (EvWindow *window)
 {
        EvView *view = EV_VIEW (window->priv->view);
-       char *uri = window->priv->uri;
+       gchar *uri = window->priv->uri;
        GEnumValue *enum_value;
        GValue sizing_mode = { 0, };
        GValue zoom = { 0, };
@@ -1060,17 +1053,6 @@ setup_view_from_metadata (EvWindow *window)
        GValue presentation = { 0, };
        GValue fullscreen = { 0, };
        GValue rotation = { 0, };
-       GValue maximized = { 0, };
-
-       /* Maximized */
-       if (ev_metadata_manager_get (uri, "window_maximized", &maximized, FALSE)) {
-               if (g_value_get_boolean (&maximized)) {
-                       gtk_window_maximize (GTK_WINDOW (window));
-               } else {
-                       gtk_window_unmaximize (GTK_WINDOW (window));
-               }
-               g_value_unset (&maximized);
-       }
 
        /* Sizing mode */
        if (ev_metadata_manager_get (uri, "sizing_mode", &sizing_mode, FALSE)) {
@@ -1175,7 +1157,8 @@ ev_window_refresh_window_thumbnail (EvWindow *ev_window, int rotation)
        EvDocument *document = ev_window->priv->document;
        
        if (!EV_IS_DOCUMENT_THUMBNAILS (document) ||
-           ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) {
+           ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0 ||
+           ev_page_cache_check_dimensions (ev_window->priv->page_cache)) {
                return;
        }
        
@@ -1250,19 +1233,31 @@ ev_window_set_document (EvWindow *ev_window, EvDocument *document)
        g_signal_connect (ev_window->priv->page_cache, "history-changed",
                          G_CALLBACK (history_changed_cb), ev_window);
 
-       setup_size_from_metadata (ev_window);
-       setup_sidebar_from_metadata (ev_window, document);
-       setup_document_from_metadata (ev_window);
+       if (ev_window->priv->in_reload && ev_window->priv->dest) {
+               gint page;
 
-       if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) {
-               ev_view_set_document (view, document);
-       } else {
+               /* Restart the current page */
+               page = CLAMP (ev_link_dest_get_page (ev_window->priv->dest),
+                             0,
+                             ev_page_cache_get_n_pages (ev_window->priv->page_cache) - 1);
+               ev_page_cache_set_current_page (ev_window->priv->page_cache, page);
+               g_object_unref (ev_window->priv->dest);
+               ev_window->priv->dest = NULL;
+       }
+
+       if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) <= 0) {
                ev_window_warning_message (ev_window, "%s",
                                           _("The document contains no pages"));
+       } else if (ev_page_cache_check_dimensions (ev_window->priv->page_cache)) {
+               ev_window_warning_message (ev_window, "%s",
+                                          _("The document contains only empty pages"));
+       } else {
+               ev_view_set_document (view, document);
        }
 
        if (ev_window->priv->setup_document_idle > 0)
                g_source_remove (ev_window->priv->setup_document_idle);
+
        ev_window->priv->setup_document_idle = g_idle_add ((GSourceFunc)ev_window_setup_document, ev_window);
 }
 
@@ -1322,17 +1317,7 @@ ev_window_clear_local_uri (EvWindow *ev_window)
 }
 
 static void
-ev_window_clear_print_settings_file (EvWindow *ev_window)
-{
-       if (ev_window->priv->print_settings_file) {
-               g_unlink (ev_window->priv->print_settings_file);
-               g_free (ev_window->priv->print_settings_file);
-               ev_window->priv->print_settings_file = NULL;
-       }
-}
-
-static void
-ev_window_clear_temp_file (EvWindow *ev_window)
+ev_window_clear_temp_symlink (EvWindow *ev_window)
 {
        GFile *file, *tempdir;
 
@@ -1340,10 +1325,24 @@ ev_window_clear_temp_file (EvWindow *ev_window)
                return;
 
        file = g_file_new_for_uri (ev_window->priv->uri);
-       tempdir = g_file_new_for_path (g_get_tmp_dir ());
+       tempdir = g_file_new_for_path (ev_tmp_dir ());
 
        if (g_file_has_prefix (file, tempdir)) {
-               g_file_delete (file, NULL, NULL);
+               GFileInfo *file_info;
+               GError    *error = NULL;
+
+               file_info = g_file_query_info (file,
+                                              G_FILE_ATTRIBUTE_STANDARD_IS_SYMLINK,
+                                              G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,
+                                              NULL, &error);
+               if (file_info) {
+                       if (g_file_info_get_is_symlink (file_info))
+                               g_file_delete (file, NULL, NULL);
+                       g_object_unref (file_info);
+               } else {
+                       g_warning ("Error deleting temp symlink: %s\n", error->message);
+                       g_error_free (error);
+               }
        }
 
        g_object_unref (file);
@@ -1373,14 +1372,11 @@ ev_window_load_job_cb (EvJob *job,
        /* Success! */
        if (!ev_job_is_failed (job)) {
                ev_window_set_document (ev_window, document);
-               
-               if (ev_window->priv->window_mode != EV_WINDOW_MODE_PREVIEW) {
-                       setup_view_from_metadata (ev_window);
-               }
 
-               if (!ev_window->priv->unlink_temp_file) {
-                       ev_window_add_recent (ev_window, ev_window->priv->uri);
-               }
+               setup_document_from_metadata (ev_window);
+               setup_view_from_metadata (ev_window);
+
+               ev_window_add_recent (ev_window, ev_window->priv->uri);
 
                ev_window_title_set_type (ev_window->priv->title,
                                          EV_WINDOW_TITLE_DOCUMENT);
@@ -1417,9 +1413,6 @@ ev_window_load_job_cb (EvJob *job,
                        case EV_WINDOW_MODE_PRESENTATION:
                                ev_window_run_presentation (ev_window);
                                break;
-                       case EV_WINDOW_MODE_PREVIEW:
-                               ev_window_run_preview (ev_window);
-                               break;
                        default:
                                break;
                }
@@ -1443,8 +1436,7 @@ ev_window_load_job_cb (EvJob *job,
                return;
        }
 
-       if (job->error->domain == EV_DOCUMENT_ERROR &&
-           job->error->code == EV_DOCUMENT_ERROR_ENCRYPTED) {
+       if (g_error_matches (job->error, EV_DOCUMENT_ERROR, EV_DOCUMENT_ERROR_ENCRYPTED)) {
                gchar *password;
                
                setup_view_from_metadata (ev_window);
@@ -1495,11 +1487,14 @@ ev_window_reload_job_cb (EvJob    *job,
        if (ev_job_is_failed (job)) {
                ev_window_clear_reload_job (ev_window);
                ev_window->priv->in_reload = FALSE;
+               g_object_unref (ev_window->priv->dest);
+               ev_window->priv->dest = NULL;
+               
                return;
        }
        
        ev_window_set_document (ev_window, job->document);
-
+       
        /* Restart the search after reloading */
        widget = gtk_window_get_focus (GTK_WINDOW (ev_window));
        if (widget && gtk_widget_get_ancestor (widget, EGG_TYPE_FIND_BAR)) {
@@ -1596,12 +1591,15 @@ show_loading_progress (EvWindow *ev_window)
 {
        GtkWidget *area;
        gchar     *text;
+       gchar     *display_name;
        
        if (ev_window->priv->message_area)
                return FALSE;
-       
-       text = g_strdup_printf (_("Loading document from %s"),
-                               ev_window->priv->uri);
+
+       display_name = escape_uri_for_display (ev_window->priv->uri);
+       text = g_strdup_printf (_("Loading document from “%s”"),
+                               display_name);
+
        area = ev_progress_message_area_new (GTK_STOCK_OPEN,
                                             text,
                                             GTK_STOCK_CLOSE,
@@ -1614,7 +1612,9 @@ show_loading_progress (EvWindow *ev_window)
                          ev_window);
        gtk_widget_show (area);
        ev_window_set_message_area (ev_window, area);
+
        g_free (text);
+       g_free (display_name);
 
        return FALSE;
 }
@@ -1697,22 +1697,19 @@ window_open_file_copy_ready_cb (GFile        *source,
                return;
        }
 
-       if (error->domain == G_IO_ERROR &&
-           error->code == G_IO_ERROR_NOT_MOUNTED) {
+       if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_MOUNTED)) {
                GMountOperation *operation;
 
-               operation = ev_mount_operation_new (GTK_WINDOW (ev_window));
+               operation = gtk_mount_operation_new (GTK_WINDOW (ev_window));
                g_file_mount_enclosing_volume (source,
                                               G_MOUNT_MOUNT_NONE,
                                               operation, NULL,
                                               (GAsyncReadyCallback)mount_volume_ready_cb,
                                               ev_window);
                g_object_unref (operation);
-       } else if (error->domain == G_IO_ERROR &&
-                  error->code == G_IO_ERROR_CANCELLED) {
+       } else if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                ev_window_clear_load_job (ev_window);
                ev_window_clear_local_uri (ev_window);
-               ev_window_clear_print_settings_file (ev_window);
                g_free (ev_window->priv->uri);
                ev_window->priv->uri = NULL;
                g_object_unref (source);
@@ -1792,9 +1789,7 @@ ev_window_open_uri (EvWindow       *ev_window,
                    const char     *uri,
                    EvLinkDest     *dest,
                    EvWindowRunMode mode,
-                   const gchar    *search_string, 
-                   gboolean        unlink_temp_file,
-                   const gchar    *print_settings)
+                   const gchar    *search_string)
 {
        GFile *source_file;
 
@@ -1814,17 +1809,10 @@ ev_window_open_uri (EvWindow       *ev_window,
        ev_window_close_dialogs (ev_window);
        ev_window_clear_load_job (ev_window);
        ev_window_clear_local_uri (ev_window);
-       ev_window_clear_print_settings_file (ev_window);
        ev_view_set_loading (EV_VIEW (ev_window->priv->view), TRUE);
 
-       ev_window->priv->unlink_temp_file = unlink_temp_file;
        ev_window->priv->window_mode = mode;
 
-       if (mode == EV_WINDOW_MODE_PREVIEW) {
-               ev_window->priv->print_settings_file = print_settings ? 
-                       g_strdup (print_settings) : NULL;
-       }
-
        if (ev_window->priv->uri)
                g_free (ev_window->priv->uri);
        ev_window->priv->uri = g_strdup (uri);
@@ -1839,7 +1827,7 @@ ev_window_open_uri (EvWindow       *ev_window,
        ev_window->priv->dest = dest ? g_object_ref (dest) : NULL;
 
        setup_size_from_metadata (ev_window);
-       
+
        ev_window->priv->load_job = ev_job_load_new (uri);
        g_signal_connect (ev_window->priv->load_job,
                          "finished",
@@ -1907,8 +1895,7 @@ reload_remote_copy_ready_cb (GFile        *remote,
        
        g_file_copy_finish (remote, async_result, &error);
        if (error) {
-               if (error->domain != G_IO_ERROR ||
-                   error->code != G_IO_ERROR_CANCELLED)
+               if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
                        ev_window_error_message (ev_window, error,
                                                 "%s", _("Failed to reload document."));
                g_error_free (error);
@@ -2007,9 +1994,19 @@ ev_window_reload_remote (EvWindow *ev_window)
 static void
 ev_window_reload_document (EvWindow *ev_window)
 {
+       gint page;
+
+       
        ev_window_clear_reload_job (ev_window);
        ev_window->priv->in_reload = TRUE;
 
+       page = ev_page_cache_get_current_page (ev_window->priv->page_cache);
+       
+       if (ev_window->priv->dest)
+               g_object_unref (ev_window->priv->dest);
+       /* FIXME: save the scroll position too (xyz dest) */
+       ev_window->priv->dest = ev_link_dest_new_page (page);
+
        if (ev_window->priv->local_uri) {
                ev_window_reload_remote (ev_window);
        } else {
@@ -2022,24 +2019,25 @@ file_open_dialog_response_cb (GtkWidget *chooser,
                              gint       response_id,
                              EvWindow  *ev_window)
 {
-       gchar *uri;
-
        if (response_id == GTK_RESPONSE_OK) {
                GSList *uris;
+               gchar  *uri;
 
                uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser));
 
                ev_application_open_uri_list (EV_APP, uris,
                                              gtk_window_get_screen (GTK_WINDOW (ev_window)),
                                              GDK_CURRENT_TIME);
-       
-               g_slist_foreach (uris, (GFunc)g_free, NULL);    
+
+               g_slist_foreach (uris, (GFunc)g_free, NULL);
                g_slist_free (uris);
-       }
 
-       uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser));
-       ev_application_set_chooser_uri (EV_APP, uri);
-       g_free (uri);
+               uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (chooser));
+               ev_application_set_filechooser_uri (EV_APP,
+                                                   GTK_FILE_CHOOSER_ACTION_OPEN,
+                                                   uri);
+               g_free (uri);
+       }
 
        gtk_widget_destroy (chooser);
 }
@@ -2047,7 +2045,9 @@ file_open_dialog_response_cb (GtkWidget *chooser,
 static void
 ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
 {
-       GtkWidget *chooser;
+       GtkWidget   *chooser;
+       const gchar *default_uri;
+       gchar       *parent_uri = NULL;
 
        chooser = gtk_file_chooser_dialog_new (_("Open Document"),
                                               GTK_WINDOW (window),
@@ -2060,12 +2060,23 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
        ev_document_factory_add_filters (chooser, NULL);
        gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE);
        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE);
-       if (ev_application_get_chooser_uri (EV_APP) != NULL) {
-               gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser),
-                                         ev_application_get_chooser_uri (EV_APP));
-       } else if (window->priv->uri != NULL) {
-               gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser),
-                                         window->priv->uri);
+
+       default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_OPEN);
+       if (!default_uri && window->priv->uri) {
+               GFile *file, *parent;
+
+               file = g_file_new_for_uri (window->priv->uri);
+               parent = g_file_get_parent (file);
+               if (parent) {
+                       parent_uri = g_file_get_uri (parent);
+                       default_uri = parent_uri;
+                       g_object_unref (parent);
+               }
+               g_object_unref (file);
+       }
+
+       if (default_uri) {
+               gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (chooser), default_uri);
        } else {
                const gchar *folder;
 
@@ -2073,7 +2084,8 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
                gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser),
                                                     folder ? folder : g_get_home_dir ());
        }
-       
+       g_free (parent_uri);
+
        g_signal_connect (chooser, "response",
                          G_CALLBACK (file_open_dialog_response_cb),
                          window);
@@ -2084,10 +2096,11 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
 static gchar *
 ev_window_create_tmp_symlink (const gchar *filename, GError **error)
 {
-       gchar *tmp_filename = NULL;
-       gchar *name;
-       gint   res;
-       guint  i = 0;
+       gchar  *tmp_filename = NULL;
+       gchar  *name;
+       guint   i = 0;
+       GError *link_error = NULL;
+       GFile  *tmp_file = NULL;
 
        name = g_path_get_basename (filename);
        
@@ -2096,29 +2109,32 @@ ev_window_create_tmp_symlink (const gchar *filename, GError **error)
 
                if (tmp_filename)
                        g_free (tmp_filename);
+               if (tmp_file)
+                       g_object_unref (tmp_file);
+               g_clear_error (&link_error);
 
                basename = g_strdup_printf ("%s-%d", name, i++);
                tmp_filename = g_build_filename (ev_tmp_dir (),
                                                 basename, NULL);
                
                g_free (basename);
-       } while ((res = symlink (filename, tmp_filename)) != 0 && errno == EEXIST);
-
-       g_free (name);
+               tmp_file = g_file_new_for_path (tmp_filename);
+       } while (!g_file_make_symbolic_link (tmp_file, filename, NULL, &link_error) &&
+                g_error_matches (link_error, G_IO_ERROR, G_IO_ERROR_EXISTS));
        
-       if (res != 0 && errno != EEXIST) {
-               if (error) {
-                       *error = g_error_new (G_FILE_ERROR,
-                                             g_file_error_from_errno (errno),
-                                             _("Couldn't create symlink “%s”: %s"),
-                                             tmp_filename, strerror (errno));
-               }
+       g_free (name);
+       g_object_unref (tmp_file);
 
+       if (link_error) {
+               g_propagate_prefixed_error (error, 
+                                           link_error,
+                                           _("Couldn't create symlink “%s”: "),
+                                           tmp_filename);
                g_free (tmp_filename);
-
+               
                return NULL;
        }
-       
+
        return tmp_filename;
 }
 
@@ -2158,8 +2174,6 @@ ev_window_cmd_file_open_copy_at_dest (EvWindow *window, EvLinkDest *dest)
                                         dest,
                                         0,
                                         NULL, 
-                                        TRUE,
-                                        NULL,
                                         GDK_CURRENT_TIME);
        g_free (symlink_uri);
 }
@@ -2193,8 +2207,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action,
        
        ev_application_open_uri_at_dest (EV_APP, uri,
                                         gtk_window_get_screen (GTK_WINDOW (window)),
-                                        NULL, 0, NULL, FALSE, NULL, 
-                                        GDK_CURRENT_TIME);
+                                        NULL, 0, NULL, GDK_CURRENT_TIME);
 }
 
 static void
@@ -2204,8 +2217,7 @@ ev_window_open_recent_action_item_activated (EvOpenRecentAction *action,
 {
        ev_application_open_uri_at_dest (EV_APP, uri,
                                         gtk_window_get_screen (GTK_WINDOW (window)),
-                                        NULL, 0, NULL, FALSE, NULL, 
-                                        GDK_CURRENT_TIME);
+                                        NULL, 0, NULL, GDK_CURRENT_TIME);
 }
 
 static void
@@ -2424,8 +2436,7 @@ window_save_file_copy_ready_cb (GFile        *src,
                return;
        }
 
-       if (error->domain != G_IO_ERROR ||
-           error->code != G_IO_ERROR_CANCELLED) {
+       if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
                gchar *name;
                
                name = g_file_get_basename (dst);
@@ -2540,17 +2551,32 @@ file_save_dialog_response_cb (GtkWidget *fc,
                              EvWindow  *ev_window)
 {
        gchar *uri;
-       
+       GFile *file, *parent;
+
        if (response_id != GTK_RESPONSE_OK) {
                gtk_widget_destroy (fc);
                return;
        }
-       
+
        uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc));
+       file = g_file_new_for_uri (uri);
+       parent = g_file_get_parent (file);
+       g_object_unref (file);
+       if (parent) {
+               gchar *folder_uri;
+
+               folder_uri = g_file_get_uri (parent);
+               ev_application_set_filechooser_uri (EV_APP,
+                                                   GTK_FILE_CHOOSER_ACTION_SAVE,
+                                                   folder_uri);
+               g_free (folder_uri);
+               g_object_unref (parent);
+       }
+
        /* FIXME: remote copy should be done here rather than in the save job, 
         * so that we can track progress and cancel the operation
         */
-       
+
        ev_window_clear_save_job (ev_window);
        ev_window->priv->save_job = ev_job_save_new (ev_window->priv->document,
                                                     uri, ev_window->priv->uri);
@@ -2570,7 +2596,7 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
        GtkWidget *fc;
        gchar *base_name;
        GFile *file;
-       const gchar *folder;
+       const gchar *default_uri;
 
        fc = gtk_file_chooser_dialog_new (
                _("Save a Copy"),
@@ -2581,20 +2607,31 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window)
 
        ev_document_factory_add_filters (fc, ev_window->priv->document);
        gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK);
+        gtk_dialog_set_alternative_button_order (GTK_DIALOG (fc),
+                                                GTK_RESPONSE_OK,
+                                                GTK_RESPONSE_CANCEL,
+                                                -1);
 
        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE);
        gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE);
        file = g_file_new_for_uri (ev_window->priv->uri);
        base_name = g_file_get_basename (file);
        gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name);
-       
-       folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
-       gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
-                                            folder ? folder : g_get_home_dir ());
-       
+
+       default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_SAVE);
+       if (default_uri) {
+               gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (fc), default_uri);
+       } else {
+               const gchar *folder;
+
+               folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS);
+               gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc),
+                                                    folder ? folder : g_get_home_dir ());
+       }
+
        g_object_unref (file);
        g_free (base_name);
-        
+
        g_signal_connect (fc, "response",
                          G_CALLBACK (file_save_dialog_response_cb),
                          ev_window);
@@ -3113,6 +3150,11 @@ ev_window_cmd_file_close_window (GtkAction *action, EvWindow *ev_window)
                                GTK_RESPONSE_YES,
                                NULL);
        gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
+        gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
+                                                 GTK_RESPONSE_YES,
+                                                 GTK_RESPONSE_NO,
+                                                 GTK_RESPONSE_CANCEL,
+                                                 -1);
 
        g_signal_connect (dialog, "response",
                          G_CALLBACK (print_jobs_confirmation_dialog_response),
@@ -3569,38 +3611,6 @@ ev_window_cmd_view_presentation (GtkAction *action, EvWindow *window)
        }
 }
 
-static void
-ev_window_run_preview (EvWindow *window)
-{
-       GtkAction *action;
-       
-       if (!window->priv->preview_toolbar) {
-               window->priv->preview_toolbar =
-                       gtk_ui_manager_get_widget (window->priv->ui_manager,
-                                                  "/PreviewToolbar");
-
-               gtk_box_pack_start (GTK_BOX (window->priv->main_box),
-                                   window->priv->preview_toolbar,
-                                   FALSE, FALSE, 0);
-               gtk_box_reorder_child (GTK_BOX (window->priv->main_box),
-                                      window->priv->preview_toolbar, 1);
-       }
-       
-       ev_view_set_continuous (EV_VIEW (window->priv->view), FALSE); 
-       
-       update_chrome_flag (window, EV_CHROME_TOOLBAR, FALSE);
-       update_chrome_flag (window, EV_CHROME_MENUBAR, FALSE);
-       update_chrome_flag (window, EV_CHROME_SIDEBAR, FALSE);
-
-       update_chrome_flag (window, EV_CHROME_PREVIEW_TOOLBAR, TRUE);
-       
-       action = gtk_action_group_get_action (window->priv->action_group,
-                                             "PreviewPrint");
-       gtk_action_set_visible (action, TRUE);
-
-       update_chrome_visibility (window);
-}
-
 static void
 ev_window_screen_changed (GtkWidget *widget,
                          GdkScreen *old_screen)
@@ -3832,7 +3842,6 @@ ev_window_cmd_view_autoscroll (GtkAction *action, EvWindow *ev_window)
        ev_view_autoscroll_start (EV_VIEW (ev_window->priv->view));
 }
 
-#if GTK_CHECK_VERSION (2, 14, 0)
 static void
 ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
 {
@@ -3848,56 +3857,6 @@ ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
                g_error_free (error);
        }
 }
-#else /* !GTK_CHECK_VERSION (2, 14, 0) */
-static void
-ev_window_cmd_help_contents (GtkAction *action, EvWindow *ev_window)
-{
-       GError *error = NULL;
-       GdkScreen *screen;
-       char *command;
-       const char *lang;
-       char *uri = NULL;
-
-       int i;
-
-       const char * const * langs = g_get_language_names ();
-
-       for (i = 0; langs[i]; i++) {
-               lang = langs[i];
-               if (strchr (lang, '.')) {
-                       continue;
-               }
-
-               uri = g_build_filename(GNOMEDATADIR,
-                                      "/gnome/help/" PACKAGE,
-                                      lang,
-                                      "/evince.xml",
-                                      NULL);
-                                       
-               if (g_file_test (uri, G_FILE_TEST_EXISTS)) {
-                       break;
-               }
-               g_free (uri);
-               uri = NULL;
-       }
-
-       if (uri == NULL) {
-               g_warning ("Cannot find help");
-               return;
-       }
-       
-       command = g_strconcat ("gnome-help ghelp://", uri,  NULL);
-       g_free (uri);
-       
-       screen = gtk_widget_get_screen (GTK_WIDGET (ev_window));
-       gdk_spawn_command_line_on_screen (screen, command, &error);
-       if (error != NULL) {
-               g_warning ("%s", error->message);
-               g_error_free (error);
-       }
-       g_free (command);
-}
-#endif /* GTK_CHECK_VERSION (2, 14, 0) */
 
 static void
 ev_window_cmd_leave_fullscreen (GtkAction *action, EvWindow *window)
@@ -3911,137 +3870,6 @@ ev_window_cmd_start_presentation (GtkAction *action, EvWindow *window)
        ev_window_run_presentation (window);
 }
 
-static gboolean
-ev_window_enumerate_printer_cb (GtkPrinter *printer,
-                               EvWindow   *window)
-{
-       EvWindowPrivate *priv = window->priv;
-       const gchar *printer_name;
-
-       printer_name = gtk_print_settings_get_printer (priv->print_settings);
-       if ((printer_name
-            && strcmp (printer_name, gtk_printer_get_name (printer)) == 0) ||
-           (!printer_name && gtk_printer_is_default (printer))) {
-               if (priv->printer)
-                       g_object_unref (priv->printer);
-               priv->printer = g_object_ref (printer);
-
-               /* Now that we have the printer, we'll start the print */
-               ev_window_do_preview_print (window);
-
-               return TRUE; /* we're done */
-       }
-
-       return FALSE; /* continue the enumeration */
-}
-
-static void
-ev_window_preview_print_finished (GtkPrintJob *print_job,
-                                 EvWindow    *window,
-                                 GError      *error)
-{
-       if (error) {
-               ev_window_error_message (window, error,
-                                        "%s", _("Failed to print document"));
-       }
-
-       g_object_unref (print_job);
-       gtk_widget_destroy (GTK_WIDGET (window));
-}
-
-static void
-ev_window_do_preview_print (EvWindow *window)
-{
-       EvWindowPrivate  *priv = window->priv;
-       GtkPrintJob      *job;
-       gchar            *filename;
-       GError           *error = NULL;
-
-       g_assert (priv->print_settings != NULL);
-       g_assert (priv->printer != NULL);
-
-       job = gtk_print_job_new (gtk_window_get_title (GTK_WINDOW (window)),
-                                priv->printer,
-                                priv->print_settings,
-                                priv->print_page_setup);
-
-       g_object_unref (priv->print_settings);
-       priv->print_settings = NULL;
-       g_object_unref (priv->print_page_setup);
-       priv->print_page_setup = NULL;
-       g_object_unref (priv->printer);
-       priv->printer = NULL;
-
-       filename = g_filename_from_uri (priv->local_uri ?
-                                       priv->local_uri : priv->uri,
-                                       NULL, NULL);
-
-       if (gtk_print_job_set_source_file (job, filename, &error)) {
-               gtk_print_job_send (job,
-                                   (GtkPrintJobCompleteFunc)ev_window_preview_print_finished,
-                                   window, NULL);
-       } else {
-               g_warning ("%s", error->message);
-               g_error_free (error);
-       }
-
-       g_free (filename);
-
-       gtk_widget_hide (GTK_WIDGET (window));
-}
-
-static void
-ev_window_cmd_preview_print (GtkAction *action, EvWindow *window)
-{
-       EvWindowPrivate  *priv = window->priv;
-       GtkPrintSettings *print_settings;
-       GtkPageSetup     *page_setup;
-       const gchar      *print_settings_file = priv->print_settings_file;
-
-       if (print_settings_file && g_file_test (print_settings_file, G_FILE_TEST_IS_REGULAR)) {
-               GKeyFile *key_file;
-               GError   *error = NULL;
-
-               key_file = g_key_file_new ();
-               g_key_file_load_from_file (key_file,
-                                          print_settings_file,
-                                          G_KEY_FILE_KEEP_COMMENTS |
-                                          G_KEY_FILE_KEEP_TRANSLATIONS,
-                                          &error);
-               if (!error) {
-                       print_settings =
-                               gtk_print_settings_new_from_key_file (key_file,
-                                                                     "Print Settings",
-                                                                     NULL);
-                       print_settings = print_settings ? print_settings : gtk_print_settings_new ();
-                       
-                       page_setup = gtk_page_setup_new_from_key_file (key_file,
-                                                                      "Page Setup",
-                                                                      NULL);
-                       page_setup = page_setup ? page_setup : gtk_page_setup_new ();
-               } else {
-                       print_settings = gtk_print_settings_new ();
-                       page_setup = gtk_page_setup_new ();
-                       g_error_free (error);
-               }
-
-               g_key_file_free (key_file);
-       } else {
-               print_settings = gtk_print_settings_new ();
-               page_setup = gtk_page_setup_new ();
-       }
-       
-       if (priv->print_settings)
-               g_object_unref (priv->print_settings);
-       priv->print_settings = print_settings;
-       if (priv->print_page_setup)
-               g_object_unref (priv->print_page_setup);
-       priv->print_page_setup = page_setup;
-
-       gtk_enumerate_printers ((GtkPrinterFunc) ev_window_enumerate_printer_cb,
-                               window, NULL, FALSE);
-}
-
 static void
 ev_window_cmd_escape (GtkAction *action, EvWindow *window)
 {
@@ -4091,51 +3919,59 @@ save_sizing_mode (EvWindow *window)
                                                enum_value->value_nick);
 }
 
+static void
+ev_window_set_view_size (EvWindow *window)
+{
+       gint width, height;
+       GtkRequisition vsb_requisition;
+       GtkRequisition hsb_requisition;
+       gint scrollbar_spacing;
+       GtkWidget *scrolled_window = window->priv->scrolled_window;
+
+       if (!window->priv->view)
+               return;
+
+       /* Calculate the width available for the content */
+       width  = scrolled_window->allocation.width;
+       height = scrolled_window->allocation.height;
+
+       if (gtk_scrolled_window_get_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window)) == GTK_SHADOW_IN) {
+               width -=  2 * window->priv->view->style->xthickness;
+               height -= 2 * window->priv->view->style->ythickness;
+       }
+
+       gtk_widget_size_request (GTK_SCROLLED_WINDOW (scrolled_window)->vscrollbar,
+                                &vsb_requisition);
+       gtk_widget_size_request (GTK_SCROLLED_WINDOW (scrolled_window)->hscrollbar,
+                                &hsb_requisition);
+       gtk_widget_style_get (scrolled_window,
+                             "scrollbar_spacing",
+                             &scrollbar_spacing,
+                             NULL);
+
+       ev_view_set_zoom_for_size (EV_VIEW (window->priv->view),
+                                  MAX (1, width),
+                                  MAX (1, height),
+                                  vsb_requisition.width + scrollbar_spacing,
+                                  hsb_requisition.height + scrollbar_spacing);
+}
+
 static void     
 ev_window_sizing_mode_changed_cb (EvView *view, GParamSpec *pspec,
                                  EvWindow   *ev_window)
 {
-       GtkWidget *scrolled_window;
        EvSizingMode sizing_mode;
 
        g_object_get (ev_window->priv->view,
                      "sizing-mode", &sizing_mode,
                      NULL);
 
-       scrolled_window = ev_window->priv->scrolled_window;
-
-       g_signal_handlers_disconnect_by_func (ev_window->priv->view, ev_view_update_view_size, scrolled_window);
-
-       if (sizing_mode != EV_SIZING_FREE)
-               ev_view_update_view_size (EV_VIEW (ev_window->priv->view),
-                                         GTK_SCROLLED_WINDOW (scrolled_window));
-
-       switch (sizing_mode) {
-               case EV_SIZING_BEST_FIT:
-                       g_object_set (G_OBJECT (scrolled_window),
-                                     "hscrollbar-policy", GTK_POLICY_NEVER,
-                                     "vscrollbar-policy", GTK_POLICY_AUTOMATIC,
-                                     NULL);
-                       g_signal_connect (ev_window->priv->view, "zoom_invalid",
-                                         G_CALLBACK (ev_view_update_view_size),
-                                         scrolled_window);
-                       break;
-               case EV_SIZING_FIT_WIDTH:
-                       g_object_set (G_OBJECT (scrolled_window),
-                                     "hscrollbar-policy", GTK_POLICY_NEVER,
-                                     "vscrollbar-policy", GTK_POLICY_AUTOMATIC,
-                                     NULL);
-                       g_signal_connect (ev_window->priv->view, "zoom_invalid",
-                                         G_CALLBACK (ev_view_update_view_size),
-                                         scrolled_window);
-                       break;
-               case EV_SIZING_FREE:
-                       g_object_set (G_OBJECT (scrolled_window),
-                                     "hscrollbar-policy", GTK_POLICY_AUTOMATIC,
-                                     "vscrollbar-policy", GTK_POLICY_AUTOMATIC,
-                                     NULL);
-                       break;
-       }
+       g_object_set (ev_window->priv->scrolled_window,
+                     "hscrollbar-policy",
+                     sizing_mode == EV_SIZING_FREE ?
+                     GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER,
+                     "vscrollbar-policy", GTK_POLICY_AUTOMATIC,
+                     NULL);
 
        update_sizing_buttons (ev_window);
        save_sizing_mode (ev_window);
@@ -4698,7 +4534,7 @@ zoom_control_changed_cb (EphyZoomAction *action,
        } else {
                mode = EV_SIZING_FREE;
        }
-       
+
        ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode);
        
        if (mode == EV_SIZING_FREE) {
@@ -4718,10 +4554,17 @@ ev_window_drag_data_received (GtkWidget        *widget,
                              guint             time)
 
 {
-       EvWindow *window = EV_WINDOW (widget);
-       gchar   **uris;
-       gint      i = 0;
-       GSList   *uri_list = NULL;
+       EvWindow  *window = EV_WINDOW (widget);
+       gchar    **uris;
+       gint       i = 0;
+       GSList    *uri_list = NULL;
+       GtkWidget *source;
+
+       source = gtk_drag_get_source_widget (context);
+       if (source && widget == gtk_widget_get_toplevel (source)) {
+               gtk_drag_finish (context, FALSE, FALSE, time);
+               return;
+       }
 
        uris = gtk_selection_data_get_uris (selection_data);
        if (!uris) {
@@ -4871,11 +4714,6 @@ ev_window_dispose (GObject *object)
        
        ev_window_close_dialogs (window);
 
-       if (window->priv->printer) {
-               g_object_unref (window->priv->printer);
-               window->priv->printer = NULL;
-       }
-
        if (window->priv->print_settings) {
                g_object_unref (window->priv->print_settings);
                window->priv->print_settings = NULL;
@@ -4913,8 +4751,8 @@ ev_window_dispose (GObject *object)
        }
 
        if (priv->uri) {
-               if (priv->unlink_temp_file)
-                       ev_window_clear_temp_file (window);
+               /* Delete the uri if it's a temp symlink (open a copy) */
+               ev_window_clear_temp_symlink (window);
                g_free (priv->uri);
                priv->uri = NULL;
        }
@@ -4934,11 +4772,6 @@ ev_window_dispose (GObject *object)
                priv->history = NULL;
        }
 
-       if (priv->print_settings_file) {
-               ev_window_clear_print_settings_file (window);
-               priv->print_settings_file = NULL;
-       }
-
        if (priv->presentation_timeout_id > 0) {
                g_source_remove (priv->presentation_timeout_id);
                priv->presentation_timeout_id = 0;
@@ -4952,6 +4785,30 @@ ev_window_dispose (GObject *object)
        G_OBJECT_CLASS (ev_window_parent_class)->dispose (object);
 }
 
+static gboolean
+ev_window_key_press_event (GtkWidget   *widget,
+                          GdkEventKey *event)
+{
+       EvWindow *ev_window = EV_WINDOW (widget);
+       gboolean  handled = FALSE;
+
+       /* Propagate the event to the view first
+        * It's needed to be able to type in
+        * annot popups windows
+        */
+       if (ev_window->priv->view) {
+               g_object_ref (ev_window->priv->view);
+               if (GTK_WIDGET_IS_SENSITIVE (ev_window->priv->view))
+                       handled = gtk_widget_event (ev_window->priv->view, (GdkEvent*) event);
+               g_object_unref (ev_window->priv->view);
+       }
+
+       if (!handled)
+               handled = GTK_WIDGET_CLASS (ev_window_parent_class)->key_press_event (widget, event);
+
+       return handled;
+}
+
 static void
 ev_window_class_init (EvWindowClass *ev_window_class)
 {
@@ -4961,6 +4818,7 @@ ev_window_class_init (EvWindowClass *ev_window_class)
        g_object_class->dispose = ev_window_dispose;
        g_object_class->finalize = ev_window_finalize;
 
+       widget_class->key_press_event = ev_window_key_press_event;
        widget_class->screen_changed = ev_window_screen_changed;
        widget_class->window_state_event = ev_window_state_event;
        widget_class->drag_data_received = ev_window_drag_data_received;
@@ -4986,7 +4844,7 @@ static const GtkActionEntry entries[] = {
                { "FileSaveAs", GTK_STOCK_SAVE_AS, N_("_Save a Copy..."), "<control>S",
          N_("Save a copy of the current document"),
          G_CALLBACK (ev_window_cmd_save_as) },
-       { "FilePrintSetup", NULL, N_("Print Set_up..."), NULL,
+       { "FilePageSetup", GTK_STOCK_PAGE_SETUP, N_("Page Set_up..."), NULL,
          N_("Setup the page settings for printing"),
          G_CALLBACK (ev_window_cmd_file_print_setup) },
        { "FilePrint", GTK_STOCK_PRINT, N_("_Print..."), "<control>P",
@@ -5011,9 +4869,9 @@ static const GtkActionEntry entries[] = {
          G_CALLBACK (ev_window_cmd_edit_find_previous) },
         { "EditToolbar", NULL, N_("T_oolbar"), NULL, NULL,
           G_CALLBACK (ev_window_cmd_edit_toolbar) },
-       { "EditRotateLeft", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), "<alt>Left", NULL,
+       { "EditRotateLeft", EV_STOCK_ROTATE_LEFT, N_("Rotate _Left"), "<control>Left", NULL,
          G_CALLBACK (ev_window_cmd_edit_rotate_left) },
-       { "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "<alt>Right", NULL,
+       { "EditRotateRight", EV_STOCK_ROTATE_RIGHT, N_("Rotate _Right"), "<control>Right", NULL,
          G_CALLBACK (ev_window_cmd_edit_rotate_right) },
 
         /* View menu */
@@ -5058,15 +4916,14 @@ static const GtkActionEntry entries[] = {
        { "StartPresentation", EV_STOCK_RUN_PRESENTATION, N_("Start Presentation"), NULL,
          N_("Start a presentation"),
          G_CALLBACK (ev_window_cmd_start_presentation) },
-       { "PreviewPrint", GTK_STOCK_PRINT, N_("Print"), NULL,
-         N_("Print this document"),
-         G_CALLBACK (ev_window_cmd_preview_print) },
 
        /* Accellerators */
        { "Escape", NULL, "", "Escape", "",
          G_CALLBACK (ev_window_cmd_escape) },
         { "Slash", GTK_STOCK_FIND, NULL, "slash", NULL,
           G_CALLBACK (ev_window_cmd_edit_find) },
+        { "F3", NULL, "", "F3", NULL,
+          G_CALLBACK (ev_window_cmd_edit_find_next) },
         { "PageDown", NULL, "", "Page_Down", NULL,
           G_CALLBACK (ev_window_cmd_scroll_forward) },
         { "PageUp", NULL, "", "Page_Up", NULL,
@@ -5420,7 +5277,7 @@ launch_action (EvWindow *window, EvLinkAction *action)
        GAppInfo *app_info;
        GFile *file;
        GList file_list = {NULL};
-       GAppLaunchContext *context = NULL;
+       GAppLaunchContext *context;
        GError *error = NULL;
 
        if (filename == NULL)
@@ -5451,12 +5308,10 @@ launch_action (EvWindow *window, EvLinkAction *action)
                return;
        }
 
-#if GTK_CHECK_VERSION (2, 14, 0)
        context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ());
        gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context),
                                           gtk_window_get_screen (GTK_WINDOW (window)));
        gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context), GDK_CURRENT_TIME);
-#endif
        
        file_list.data = file;
        if (!g_app_info_launch (app_info, &file_list, context, &error)) {
@@ -5479,17 +5334,13 @@ launch_external_uri (EvWindow *window, EvLinkAction *action)
        const gchar *uri = ev_link_action_get_uri (action);
        GError *error = NULL;
        gboolean ret;
-#if GTK_CHECK_VERSION (2, 14, 0)
-       GAppLaunchContext *context = NULL;
-#endif
+       GAppLaunchContext *context;
 
-#if GTK_CHECK_VERSION (2, 14, 0)
        context = G_APP_LAUNCH_CONTEXT (gdk_app_launch_context_new ());
        gdk_app_launch_context_set_screen (GDK_APP_LAUNCH_CONTEXT (context),
                                           gtk_window_get_screen (GTK_WINDOW (window)));
        gdk_app_launch_context_set_timestamp (GDK_APP_LAUNCH_CONTEXT (context),
                                              GDK_CURRENT_TIME);
-#endif
 
        if (!g_strstr_len (uri, strlen (uri), "://") &&
            !g_str_has_prefix (uri, "mailto:")) {
@@ -5527,8 +5378,6 @@ open_remote_link (EvWindow *window, EvLinkAction *action)
                                         ev_link_action_get_dest (action),
                                         0,
                                         NULL, 
-                                        FALSE,
-                                        NULL,
                                         GDK_CURRENT_TIME);
 
        g_free (uri);
@@ -5553,6 +5402,8 @@ do_action_named (EvWindow *window, EvLinkAction *action)
                ev_window_cmd_edit_find (NULL, window);
        } else if (g_ascii_strcasecmp (name, "Close") == 0) {
                ev_window_cmd_file_close_window (NULL, window);
+       } else if (g_ascii_strcasecmp (name, "Print") == 0) {
+               ev_window_cmd_file_print (NULL, window);
        } else {
                g_warning ("Unimplemented named action: %s, please post a "
                           "bug report in Evince bugzilla "
@@ -5741,6 +5592,11 @@ ev_view_popup_cmd_save_image_as (GtkAction *action, EvWindow *window)
                                          NULL);
 
        gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK);
+        gtk_dialog_set_alternative_button_order (GTK_DIALOG (fc),
+                                                 GTK_RESPONSE_OK,
+                                                 GTK_RESPONSE_CANCEL,
+                                                 -1);
+
        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE);
        gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE);
        
@@ -5899,6 +5755,11 @@ ev_attachment_popup_cmd_save_attachment_as (GtkAction *action, EvWindow *window)
                NULL);
 
        gtk_dialog_set_default_response (GTK_DIALOG (fc), GTK_RESPONSE_OK);
+        gtk_dialog_set_alternative_button_order (GTK_DIALOG (fc),
+                                                 GTK_RESPONSE_OK,
+                                                 GTK_RESPONSE_CANCEL,
+                                                 -1);
+
        gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (fc), TRUE);
        gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (fc), FALSE);
 
@@ -6139,7 +6000,9 @@ ev_window_init (EvWindow *ev_window)
        g_signal_connect_object (ev_window->priv->view, "handle-link",
                                 G_CALLBACK (view_handle_link_cb),
                                 ev_window, 0);
-
+       g_signal_connect_swapped (ev_window->priv->view, "zoom_invalid",
+                                G_CALLBACK (ev_window_set_view_size),
+                                ev_window);
        g_signal_connect_object (ev_window->priv->view,
                                 "popup",
                                 G_CALLBACK (view_menu_popup_cb),
@@ -6255,7 +6118,7 @@ ev_window_init (EvWindow *ev_window)
        gtk_window_set_default_size (GTK_WINDOW (ev_window), 600, 600);
 
        setup_view_from_metadata (ev_window);
-       setup_sidebar_from_metadata (ev_window, NULL);
+       setup_sidebar_from_metadata (ev_window);
 
         ev_window_sizing_mode_changed_cb (EV_VIEW (ev_window->priv->view), NULL, ev_window);
        ev_window_setup_action_sensitivity (ev_window);