]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
*** empty log message ***
[evince.git] / shell / ev-window.c
index 70cc0439f919cdaf16248f012a0fdede3e1dabe0..a3a4457d8e8ed7b0488b19aa93fcb3e68f56c469 100644 (file)
@@ -107,15 +107,15 @@ struct _EvWindowPrivate {
        GtkWidget *sidebar_thumbs;
        GtkWidget *sidebar_links;
 
-       EvWindowTitle *title;
-
        /* Dialogs */
        GtkWidget *properties;
+       GtkWidget *print_dialog;
+       GtkWidget *password_dialog;
 
        /* UI Builders */
        GtkActionGroup *action_group;
        GtkActionGroup *popups_action_group;
-       GtkUIManager *ui_manager;
+       GtkUIManager   *ui_manager;
 
        /* Fullscreen mode */
        GtkWidget *fullscreen_toolbar;
@@ -129,23 +129,18 @@ struct _EvWindowPrivate {
        /* Document */
        char *uri;
        char *local_uri;
-       char *loaded_uri;
        
        EvDocument *document;
+       EvDocument *password_document;
        EvPageCache *page_cache;
-
        EvWindowPageMode page_mode;
-
-       /* These members are used temporarily when in PAGE_MODE_PASSWORD */
-       EvDocument *password_document;
-       GtkWidget *password_dialog;
-       char *password_uri;
+       EvWindowTitle *title;
+       EggRecentViewUIManager *recent_view;
 
        /* Job used to load document */
        EvJob *xfer_job;
        EvJob *load_job;
-
-       EggRecentViewUIManager *recent_view;
+       GnomePrintJob *print_job;
 };
 
 static const GtkTargetEntry ev_drop_types[] = {
@@ -598,7 +593,8 @@ page_changed_cb (EvPageCache *page_cache,
                 EvWindow    *ev_window)
 {
        update_action_sensitivity (ev_window);
-       ev_metadata_manager_set_int (ev_window->priv->loaded_uri, "page", page);
+       if (!ev_window_is_empty (ev_window))
+               ev_metadata_manager_set_int (ev_window->priv->uri, "page", page);
 }
 
 static void
@@ -629,11 +625,12 @@ setup_document_from_metadata (EvWindow *window)
 {
        char *uri = window->priv->uri;
        GValue page = { 0, };
+       gint new_page;
 
-       /* Page */
        if (uri && ev_metadata_manager_get (uri, "page", &page, TRUE)) {
+               new_page = CLAMP (g_value_get_int (&page), 0, ev_page_cache_get_n_pages (window->priv->page_cache) - 1);
                ev_page_cache_set_current_page (window->priv->page_cache,
-                                               g_value_get_int (&page));
+                                               new_page);
        }
 }
 
@@ -754,14 +751,14 @@ setup_view_from_metadata (EvWindow *window)
 
        /* Presentation */
        if (ev_metadata_manager_get (uri, "presentation", &presentation, FALSE)) {
-               if (g_value_get_boolean (&presentation)) {
+               if (g_value_get_boolean (&presentation) && uri) {
                        ev_window_run_presentation (window);
                }
        }
 
        /* Fullscreen */
        if (ev_metadata_manager_get (uri, "fullscreen", &fullscreen, FALSE)) {
-               if (g_value_get_boolean (&fullscreen)) {
+               if (g_value_get_boolean (&fullscreen) && uri) {
                        ev_window_run_fullscreen (window);
                }
        }
@@ -806,12 +803,12 @@ ev_window_setup_document (EvWindow *ev_window)
                                         ev_window, 0);
        }
 
-       ev_window_set_page_mode (ev_window, PAGE_MODE_DOCUMENT);
        ev_sidebar_set_document (sidebar, document);
 
        if (ev_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) {
                ev_view_set_document (view, document);
        }
+       ev_window_set_page_mode (ev_window, PAGE_MODE_DOCUMENT);
 
        ev_window_title_set_document (ev_window->priv->title, document);
        ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri);
@@ -840,8 +837,6 @@ password_dialog_response (GtkWidget *password_dialog,
        char *password;
        
        if (response_id == GTK_RESPONSE_OK) {
-               EvDocument *document;
-               gchar *uri;
 
                password = ev_password_dialog_get_password (EV_PASSWORD_DIALOG (password_dialog));
                if (password) {
@@ -854,21 +849,14 @@ password_dialog_response (GtkWidget *password_dialog,
 
                ev_password_dialog_save_password (EV_PASSWORD_DIALOG (password_dialog));
 
-               document = ev_window->priv->password_document;
-               uri = ev_window->priv->password_uri;
-
+               g_object_unref (ev_window->priv->password_document);
                ev_window->priv->password_document = NULL;
-               ev_window->priv->password_uri = NULL;
 
                ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_DOCUMENT);
-
                ev_job_queue_add_job (ev_window->priv->load_job, EV_JOB_PRIORITY_HIGH);
                
                gtk_widget_destroy (password_dialog);
                        
-               g_object_unref (document);
-               g_free (uri);
-
                return;
        }
 
@@ -884,16 +872,15 @@ static void
 ev_window_popup_password_dialog (EvWindow *ev_window)
 {
        g_assert (ev_window->priv->password_document);
-       g_assert (ev_window->priv->password_uri);
 
        gtk_widget_set_sensitive (ev_window->priv->password_view, FALSE);
 
-       ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->password_uri);
+       ev_window_title_set_uri (ev_window->priv->title, ev_window->priv->uri);
        ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_PASSWORD);
 
        if (ev_window->priv->password_dialog == NULL) {
                ev_window->priv->password_dialog =
-                       g_object_new (EV_TYPE_PASSWORD_DIALOG, "uri", ev_window->priv->password_uri, NULL);
+                       g_object_new (EV_TYPE_PASSWORD_DIALOG, "uri", ev_window->priv->uri, NULL);
                gtk_window_set_transient_for (GTK_WINDOW (ev_window->priv->password_dialog), GTK_WINDOW (ev_window));
 
                g_object_add_weak_pointer (G_OBJECT (ev_window->priv->password_dialog),
@@ -972,24 +959,16 @@ ev_window_load_job_cb  (EvJobLoad *job,
                g_object_unref (ev_window->priv->password_document);
                ev_window->priv->password_document = NULL;
        }
-       if (ev_window->priv->password_uri) {
-               g_free (ev_window->priv->password_uri);
-               ev_window->priv->password_uri = NULL;
-       }
 
        /* Success! */
        if (job->error == NULL) {
+               
                if (ev_window->priv->document)
                        g_object_unref (ev_window->priv->document);
                ev_window->priv->document = g_object_ref (document);
-               ev_window_setup_document (ev_window);
-               
-               ev_window_add_recent (ev_window, ev_window->priv->uri);
-               
-               if (ev_window->priv->loaded_uri)
-                       g_free (ev_window->priv->loaded_uri);
-               ev_window->priv->loaded_uri = g_strdup (ev_window->priv->uri);
                
+               ev_window_setup_document (ev_window);
+               ev_window_add_recent (ev_window, ev_window->priv->uri);         
                ev_window_clear_jobs (ev_window);
                
                return;
@@ -1000,7 +979,6 @@ ev_window_load_job_cb  (EvJobLoad *job,
                gchar *base_name, *file_name;
 
                ev_window->priv->password_document = g_object_ref (document);
-               ev_window->priv->password_uri = g_strdup (job->uri);
 
                file_name = gnome_vfs_format_uri_for_display (job->uri);
                base_name = g_path_get_basename (file_name);
@@ -1054,17 +1032,41 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
        }               
 }
 
-void
-ev_window_open_uri (EvWindow *ev_window, const char *uri)
+const char *
+ev_window_get_uri (EvWindow *ev_window)
+{
+       return ev_window->priv->uri;
+}
+
+static void
+ev_window_close_dialogs (EvWindow *ev_window)
 {
        if (ev_window->priv->password_dialog)
                gtk_widget_destroy (ev_window->priv->password_dialog);
+       ev_window->priv->password_dialog = NULL;
+
+       if (ev_window->priv->print_dialog) {
+               gtk_widget_destroy (ev_window->priv->print_dialog);
+               g_object_unref (ev_window->priv->print_job);
+       }
+       ev_window->priv->print_dialog = NULL;
+       ev_window->priv->print_job = NULL;
+
+       if (ev_window->priv->properties)
+               gtk_widget_destroy (ev_window->priv->properties);
+       ev_window->priv->properties = NULL;
+}
+
+void
+ev_window_open_uri (EvWindow *ev_window, const char *uri)
+{
 
        g_free (ev_window->priv->uri);
        ev_window->priv->uri = g_strdup (uri);
 
        setup_view_from_metadata (ev_window);
        
+       ev_window_close_dialogs (ev_window);
        ev_window_clear_jobs (ev_window);
        ev_window_clear_local_uri (ev_window);
        
@@ -1091,6 +1093,8 @@ file_open_dialog_response_cb (GtkWidget *chooser,
                g_slist_foreach (uris, (GFunc)g_free, NULL);    
                g_slist_free (uris);
        }
+       ev_application_set_chooser_uri (EV_APP, 
+                                       gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser)));
 
        gtk_widget_destroy (chooser);
 }
@@ -1111,7 +1115,10 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
        ev_document_types_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));
+       
        g_signal_connect (chooser, "response",
                          G_CALLBACK (file_open_dialog_response_cb),
                          window);
@@ -1251,113 +1258,114 @@ ev_window_print (EvWindow *window)
        page_cache = ev_page_cache_get (window->priv->document);
        last_page = ev_page_cache_get_n_pages (page_cache);
 
-       ev_window_print_range (window, 1, -1);
+       ev_window_print_range (window, 1, last_page);
 }
 
-const char *
-ev_window_get_uri (EvWindow *ev_window)
+
+static gboolean
+ev_window_print_dialog_response_cb (GtkDialog *print_dialog, gint response, gpointer data)
 {
-       return ev_window->priv->uri;
+    EvWindow *ev_window = EV_WINDOW (data);
+    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;
-       GnomePrintJob *job;
-       GtkWidget *print_dialog;
        gchar *pages_label;
-       EvPrintJob *print_job = NULL;
-       EvPageCache *page_cache;
 
         g_return_if_fail (EV_IS_WINDOW (ev_window));
        g_return_if_fail (ev_window->priv->document != NULL);
 
-       page_cache = ev_page_cache_get (ev_window->priv->document);
-       if (last_page == -1) {
-               last_page = ev_page_cache_get_n_pages (page_cache);
-       }
-
        config = load_print_config_from_file ();
-       job = gnome_print_job_new (config);
 
-       print_dialog = gnome_print_dialog_new (job, (guchar *) _("Print"),
-                                              (GNOME_PRINT_DIALOG_RANGE |
-                                               GNOME_PRINT_DIALOG_COPIES));
+       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 (print_dialog),
+       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 (print_dialog),
+       gtk_dialog_set_response_sensitive (GTK_DIALOG (ev_window->priv->print_dialog),
                                           GNOME_PRINT_DIALOG_RESPONSE_PREVIEW,
                                           FALSE);
 
-       while (TRUE) {
-               int response;
-               response = gtk_dialog_run (GTK_DIALOG (print_dialog));
-
-               if (response != GNOME_PRINT_DIALOG_RESPONSE_PRINT)
-                       break;
-
-               /* 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);
-                       
-                       continue;
-               } 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);
-
-                       continue;
-               }
-
-               save_print_config_to_file (config);
-
-               print_job = g_object_new (EV_TYPE_PRINT_JOB,
-                                         "gnome_print_job", job,
-                                         "document", ev_window->priv->document,
-                                         "print_dialog", print_dialog,
-                                         NULL);
-               break;
-       }
-
-       g_object_unref (job);
-
-       gtk_widget_destroy (print_dialog);
-
-       if (print_job != NULL) {
-               ev_print_job_print (print_job, GTK_WINDOW (ev_window));
-               g_object_unref (print_job);
-       }
-
-       g_object_unref (config);
+       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);
+       return;
 }
-
+       
 static void
 ev_window_cmd_file_print (GtkAction *action, EvWindow *ev_window)
 {
@@ -1506,8 +1514,9 @@ static void
 ev_window_sidebar_position_change_cb (GObject *object, GParamSpec *pspec,
                                      EvWindow *ev_window)
 {
-       ev_metadata_manager_set_int (ev_window->priv->loaded_uri, "sidebar_size",
-                                    gtk_paned_get_position (GTK_PANED (object)));
+       if (!ev_window_is_empty (ev_window))
+               ev_metadata_manager_set_int (ev_window->priv->uri, "sidebar_size",
+                                            gtk_paned_get_position (GTK_PANED (object)));
 }
 
 static void
@@ -1724,7 +1733,8 @@ ev_window_run_fullscreen (EvWindow *window)
        gtk_window_fullscreen (GTK_WINDOW (window));
        ev_window_update_fullscreen_popup (window);
 
-       ev_metadata_manager_set_boolean (window->priv->loaded_uri, "fullscreen", TRUE);
+       if (!ev_window_is_empty (window))
+               ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", TRUE);
 }
 
 static void
@@ -1753,7 +1763,8 @@ ev_window_stop_fullscreen (EvWindow *window)
        update_chrome_visibility (window);
        update_sidebar_visibility (window);
 
-       ev_metadata_manager_set_boolean (window->priv->loaded_uri, "fullscreen", FALSE);
+       if (!ev_window_is_empty (window))
+               ev_metadata_manager_set_boolean (window->priv->uri, "fullscreen", FALSE);
 }
 
 static void
@@ -1800,7 +1811,8 @@ ev_window_run_presentation (EvWindow *window)
        update_chrome_visibility (window);
        gtk_widget_hide (window->priv->sidebar);
 
-       ev_metadata_manager_set_boolean (window->priv->loaded_uri, "presentation", TRUE);
+       if (!ev_window_is_empty (window))
+               ev_metadata_manager_set_boolean (window->priv->uri, "presentation", TRUE);
 }
 
 static void
@@ -1818,7 +1830,8 @@ ev_window_stop_presentation (EvWindow *window)
        update_chrome_visibility (window);
        update_sidebar_visibility (window);
 
-       ev_metadata_manager_set_boolean (window->priv->loaded_uri, "presentation", FALSE);
+       if (!ev_window_is_empty (window))
+               ev_metadata_manager_set_boolean (window->priv->uri, "presentation", FALSE);
 }
 
 static void
@@ -2082,7 +2095,7 @@ ev_window_cmd_view_reload (GtkAction *action, EvWindow *ev_window)
        ev_window_open_uri (ev_window, uri);
 
        /* In case the number of pages in the document has changed. */
-       page = CLAMP (page, 0, ev_page_cache_get_n_pages (ev_window->priv->page_cache));
+       page = CLAMP (page, 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);
 
@@ -2179,8 +2192,9 @@ save_sizing_mode (EvWindow *window)
        mode = ev_view_get_sizing_mode (EV_VIEW (window->priv->view));
        enum_value = g_enum_get_value (EV_SIZING_MODE_CLASS, mode);
 
-       ev_metadata_manager_set_string (window->priv->loaded_uri, "sizing_mode",
-                                       enum_value->value_nick);
+       if (!ev_window_is_empty (window))
+               ev_metadata_manager_set_string (window->priv->uri, "sizing_mode",
+                                               enum_value->value_nick);
 }
 
 static void     
@@ -2237,8 +2251,8 @@ ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
 {
         update_action_sensitivity (ev_window);
 
-       if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
-               ev_metadata_manager_set_double (ev_window->priv->loaded_uri, "zoom",
+       if (ev_view_get_sizing_mode (view) == EV_SIZING_FREE && !ev_window_is_empty (ev_window)) {
+               ev_metadata_manager_set_double (ev_window->priv->uri, "zoom",
                                                ev_view_get_zoom (view));
        }
 }
@@ -2275,8 +2289,10 @@ static void
 ev_window_continuous_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
 {
        ev_window_update_continuous_action (ev_window);
-       ev_metadata_manager_set_boolean (ev_window->priv->loaded_uri, "continuous",
-                                        ev_view_get_continuous (EV_VIEW (ev_window->priv->view)));
+
+       if (!ev_window_is_empty (ev_window))
+               ev_metadata_manager_set_boolean (ev_window->priv->uri, "continuous",
+                                                ev_view_get_continuous (EV_VIEW (ev_window->priv->view)));
 }
 
 static void     
@@ -2286,8 +2302,9 @@ ev_window_rotation_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *window
 
        rotation = ev_view_get_rotation (EV_VIEW (window->priv->view));
 
-       ev_metadata_manager_set_int (window->priv->loaded_uri, "rotation",
-                                    rotation);
+       if (!ev_window_is_empty (window))
+               ev_metadata_manager_set_int (window->priv->uri, "rotation",
+                                            rotation);
 
        ev_sidebar_thumbnails_refresh (EV_SIDEBAR_THUMBNAILS (window->priv->sidebar_thumbs),
                                       rotation);
@@ -2303,8 +2320,10 @@ static void
 ev_window_dual_mode_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
 {
        ev_window_update_dual_page_action (ev_window);
-       ev_metadata_manager_set_boolean (ev_window->priv->loaded_uri, "dual-page",
-                                        ev_view_get_dual_page (EV_VIEW (ev_window->priv->view)));
+
+       if (!ev_window_is_empty (ev_window))
+               ev_metadata_manager_set_boolean (ev_window->priv->uri, "dual-page",
+                                                ev_view_get_dual_page (EV_VIEW (ev_window->priv->view)));
 }
 
 static char *
@@ -2435,7 +2454,9 @@ ev_window_sidebar_current_page_changed_cb (EvSidebar  *ev_sidebar,
        }
 
        g_object_unref (current_page);
-       ev_metadata_manager_set_string (ev_window->priv->loaded_uri, "sidebar_page", id);
+
+       if (!ev_window_is_empty (ev_window))
+               ev_metadata_manager_set_string (ev_window->priv->uri, "sidebar_page", id);
 }
 
 static void
@@ -2455,8 +2476,9 @@ ev_window_sidebar_visibility_changed_cb (EvSidebar *ev_sidebar, GParamSpec *pspe
                (action, G_CALLBACK (ev_window_view_sidebar_cb), ev_window);
 
        if (!ev_view_get_presentation (view) && 
-           !ev_view_get_fullscreen (view)) {
-               ev_metadata_manager_set_boolean (ev_window->priv->loaded_uri, "sidebar_visibility",
+           !ev_view_get_fullscreen (view) &&
+           !ev_window_is_empty (ev_window)) {
+               ev_metadata_manager_set_boolean (ev_window->priv->uri, "sidebar_visibility",
                                                 GTK_WIDGET_VISIBLE (ev_sidebar));
        }
 }
@@ -2470,6 +2492,9 @@ view_menu_popup_cb (EvView         *view,
        gboolean   show_external = FALSE;
        gboolean   show_internal = FALSE;
        GtkAction *action;
+
+       if (ev_view_get_presentation (EV_VIEW (ev_window->priv->view)))
+               return FALSE;
        
        if (ev_window->priv->link)
                g_object_unref (ev_window->priv->link);
@@ -2513,7 +2538,7 @@ view_menu_popup_cb (EvView         *view,
        gtk_menu_popup (GTK_MENU (popup), NULL, NULL,
                        NULL, NULL,
                        3, gtk_get_current_event_time ());
-       return TRUE;
+       return FALSE;
 }
 
 static void
@@ -2698,14 +2723,7 @@ ev_window_dispose (GObject *object)
                priv->password_document = NULL;
        }
        
-       if (priv->password_uri) {
-               g_free (priv->password_uri);
-               priv->password_uri = NULL;
-       }
-
-       if (priv->password_dialog) {
-               gtk_widget_destroy (priv->password_dialog);
-       }
+       ev_window_close_dialogs (window);
 
        if (priv->link) {
                g_object_unref (priv->link);
@@ -2720,11 +2738,6 @@ ev_window_dispose (GObject *object)
                priv->find_bar = NULL;
        }
 
-       if (priv->loaded_uri) {
-               g_free (priv->loaded_uri);
-               priv->loaded_uri = NULL;
-       }
-
        if (priv->uri) {
                g_free (priv->uri);
                priv->uri = NULL;
@@ -3138,7 +3151,8 @@ window_state_event_cb (EvWindow *window, GdkEventWindowState *event, gpointer du
                gboolean maximized;
 
                maximized = event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED;
-               ev_metadata_manager_set_boolean (window->priv->loaded_uri, "window_maximized", maximized);
+               if (!ev_window_is_empty (window))
+                       ev_metadata_manager_set_boolean (window->priv->uri, "window_maximized", maximized);
        }
 
        return FALSE;
@@ -3147,7 +3161,7 @@ window_state_event_cb (EvWindow *window, GdkEventWindowState *event, gpointer du
 static gboolean
 window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer dummy)
 {
-       char *uri = window->priv->loaded_uri;
+       char *uri = window->priv->uri;
        GdkWindowState state;
        int x, y, width, height;
 
@@ -3157,10 +3171,12 @@ window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer
                gtk_window_get_position (GTK_WINDOW (window), &x, &y);
                gtk_window_get_size (GTK_WINDOW (window), &width, &height);
 
-               ev_metadata_manager_set_int (uri, "window_x", x);
-               ev_metadata_manager_set_int (uri, "window_y", y);
-               ev_metadata_manager_set_int (uri, "window_width", width);
-               ev_metadata_manager_set_int (uri, "window_height", height);
+               if (!ev_window_is_empty (window)) {
+                       ev_metadata_manager_set_int (uri, "window_x", x);
+                       ev_metadata_manager_set_int (uri, "window_y", y);
+                       ev_metadata_manager_set_int (uri, "window_width", width);
+                       ev_metadata_manager_set_int (uri, "window_height", height);
+               }
        }
 
        return FALSE;