]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Enable print to a PDF. Fixes bug #332121.
[evince.git] / shell / ev-window.c
index c2066e492c3823c9640560a6cf2c59030081e9bf..dcf687e9e35c7cac430be2558b3ef74426064f7d 100644 (file)
@@ -299,7 +299,7 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
                can_get_text = TRUE;
        }
        
-       if (has_document && EV_IS_DOCUMENT_FIND (document)) {
+       if (has_pages && EV_IS_DOCUMENT_FIND (document)) {
                can_find = TRUE;
        }
 
@@ -336,10 +336,8 @@ ev_window_setup_action_sensitivity (EvWindow *ev_window)
 
         /* Edit menu */
        ev_window_set_action_sensitive (ev_window, "EditSelectAll", has_pages && can_get_text);
-       ev_window_set_action_sensitive (ev_window, "EditFind",
-                             has_pages && EV_IS_DOCUMENT_FIND (document));
-       ev_window_set_action_sensitive (ev_window, "Slash",
-                             has_pages && EV_IS_DOCUMENT_FIND (document));
+       ev_window_set_action_sensitive (ev_window, "EditFind", can_find);
+       ev_window_set_action_sensitive (ev_window, "Slash", can_find);
        ev_window_set_action_sensitive (ev_window, "EditRotateLeft", has_pages);
        ev_window_set_action_sensitive (ev_window, "EditRotateRight", has_pages);
 
@@ -414,6 +412,11 @@ ev_window_update_actions (EvWindow *ev_window)
 static void
 ev_window_set_view_accels_sensitivity (EvWindow *window, gboolean sensitive)
 {
+       gboolean can_find;
+       
+       can_find = window->priv->document && 
+           EV_IS_DOCUMENT_FIND (window->priv->document);
+
        if (window->priv->action_group) {
                ev_window_set_action_sensitive (window, "PageDown", sensitive);
                ev_window_set_action_sensitive (window, "PageUp", sensitive);
@@ -423,12 +426,13 @@ ev_window_set_view_accels_sensitivity (EvWindow *window, gboolean sensitive)
                ev_window_set_action_sensitive (window, "ShiftBackSpace", sensitive);
                ev_window_set_action_sensitive (window, "Return", sensitive);
                ev_window_set_action_sensitive (window, "ShiftReturn", sensitive);
-               ev_window_set_action_sensitive (window, "Slash", sensitive);
                ev_window_set_action_sensitive (window, "Plus", sensitive);
                ev_window_set_action_sensitive (window, "Minus", sensitive);
                ev_window_set_action_sensitive (window, "KpPlus", sensitive);
                ev_window_set_action_sensitive (window, "KpMinus", sensitive);
                ev_window_set_action_sensitive (window, "Equal", sensitive);
+
+               ev_window_set_action_sensitive (window, "Slash", sensitive && can_find);
        }
 }
 
@@ -676,48 +680,28 @@ setup_sidebar_from_metadata (EvWindow *window, EvDocument *document)
 }
 
 static void
-setup_view_from_metadata (EvWindow *window)
+setup_size_from_metadata (EvWindow *window)
 {
-       EvView *view = EV_VIEW (window->priv->view);
        char *uri = window->priv->uri;
-       GEnumValue *enum_value;
        GValue width = { 0, };
        GValue height = { 0, };
+       GValue width_ratio = { 0, };
+       GValue height_ratio = { 0, };
        GValue maximized = { 0, };
        GValue x = { 0, };
        GValue y = { 0, };
-       GValue sizing_mode = { 0, };
-       GValue zoom = { 0, };
-       GValue continuous = { 0, };
-       GValue dual_page = { 0, };
-       GValue presentation = { 0, };
-       GValue fullscreen = { 0, };
-       GValue rotation = { 0, };
-       gboolean restore_size = TRUE;
-
-       /* Window size */
 
        if (ev_metadata_manager_get (uri, "window_maximized", &maximized, FALSE)) {
                if (g_value_get_boolean (&maximized)) {
                        gtk_window_maximize (GTK_WINDOW (window));
-                       restore_size = FALSE;
+                       return;
                } else {
                        gtk_window_unmaximize (GTK_WINDOW (window));
                }
                g_value_unset (&maximized);
        }
 
-       if (restore_size &&
-           ev_metadata_manager_get (uri, "window_width", &width, TRUE) &&
-            ev_metadata_manager_get (uri, "window_height", &height, TRUE)) {
-               gtk_window_resize (GTK_WINDOW (window),
-                                  g_value_get_int (&width),
-                                  g_value_get_int (&height));
-               g_value_unset (&width);
-               g_value_unset (&height);                
-       }
-       if (restore_size &&
-           ev_metadata_manager_get (uri, "window_x", &x, TRUE) &&
+       if (ev_metadata_manager_get (uri, "window_x", &x, TRUE) &&
            ev_metadata_manager_get (uri, "window_y", &y, TRUE)) {
                gtk_window_move (GTK_WINDOW (window), g_value_get_int (&x),
                                 g_value_get_int (&y));
@@ -725,6 +709,63 @@ setup_view_from_metadata (EvWindow *window)
                g_value_unset (&y);
        }
 
+        if (ev_metadata_manager_get (uri, "window_width", &width, TRUE) &&
+           ev_metadata_manager_get (uri, "window_height", &height, TRUE)) {
+               gtk_window_resize (GTK_WINDOW (window),
+                                  g_value_get_int (&width),
+                                  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;
+
+               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);                 
+               
+               gtk_window_resize (GTK_WINDOW (window),
+                                  g_value_get_double (&width_ratio) * document_width,
+                                  g_value_get_double (&height_ratio) * document_height);
+               g_value_unset (&width_ratio);
+               g_value_unset (&height_ratio);
+       }
+
+}
+
+static void
+setup_view_from_metadata (EvWindow *window)
+{
+       EvView *view = EV_VIEW (window->priv->view);
+       char *uri = window->priv->uri;
+       GEnumValue *enum_value;
+       GValue sizing_mode = { 0, };
+       GValue zoom = { 0, };
+       GValue continuous = { 0, };
+       GValue dual_page = { 0, };
+       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)) {
                enum_value = g_enum_get_value_by_nick
@@ -828,6 +869,7 @@ ev_window_setup_document (EvWindow *ev_window)
                                                   ev_window->priv->document);
        }
        
+       setup_size_from_metadata (ev_window);
        setup_document_from_metadata (ev_window);
        setup_sidebar_from_metadata (ev_window, document);
 
@@ -858,7 +900,7 @@ password_dialog_response (GtkWidget *password_dialog,
                ev_window_title_set_type (ev_window->priv->title, EV_WINDOW_TITLE_DOCUMENT);
                ev_job_queue_add_job (ev_window->priv->xfer_job, EV_JOB_PRIORITY_HIGH);
                
-               gtk_widget_destroy (password_dialog);
+               gtk_widget_destroy (password_dialog);
                        
                return;
        }
@@ -950,22 +992,22 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
        /* Success! */
        if (job->error == NULL) {
 
-               g_free (ev_window->priv->uri);
+               if (ev_window->priv->uri)
+                       g_free (ev_window->priv->uri);
                ev_window->priv->uri = g_strdup (job->uri);
-               setup_view_from_metadata (ev_window);
 
-               if (job->local_uri) {
-                       ev_window->priv->local_uri = g_strdup (job->local_uri);
-               } else {
-                       ev_window->priv->local_uri = NULL;
-               }
+               if (ev_window->priv->local_uri)
+                       g_free (ev_window->priv->local_uri);
+               ev_window->priv->local_uri = 
+                   job->local_uri ? g_strdup (job->local_uri) : NULL;
                
                if (ev_window->priv->document)
                        g_object_unref (ev_window->priv->document);
                ev_window->priv->document = g_object_ref (document);
-               
+
+               setup_view_from_metadata (ev_window);
                ev_window_setup_document (ev_window);
-               ev_window_add_recent (ev_window, ev_window->priv->uri);         
+               ev_window_add_recent (ev_window, ev_window->priv->uri);
 
                if (job->dest)
                        ev_window_goto_dest (ev_window, job->dest);
@@ -996,7 +1038,6 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
                ev_window->priv->uri = g_strdup (job->uri);
                setup_view_from_metadata (ev_window);
 
-
                file_name = gnome_vfs_format_uri_for_display (job->uri);
                base_name = g_path_get_basename (file_name);
                ev_password_view_set_file_name (EV_PASSWORD_VIEW (ev_window->priv->password_view),
@@ -1004,7 +1045,7 @@ ev_window_xfer_job_cb  (EvJobXfer *job,
                g_free (file_name);
                g_free (base_name);
                ev_window_set_page_mode (ev_window, PAGE_MODE_PASSWORD);
-
+               
                ev_window_popup_password_dialog (ev_window);
        } else {
                ev_window_error_dialog (GTK_WINDOW (ev_window), 
@@ -1081,7 +1122,9 @@ file_open_dialog_response_cb (GtkWidget *chooser,
 
                uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser));
 
-               ev_application_open_uri_list (EV_APP, uris, GDK_CURRENT_TIME);
+               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_free (uris);
@@ -1108,9 +1151,13 @@ 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)
+       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);
+       }
        
        g_signal_connect (chooser, "response",
                          G_CALLBACK (file_open_dialog_response_cb),
@@ -1122,14 +1169,20 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window)
 #ifdef HAVE_GTK_RECENT
 static void
 ev_window_cmd_recent_file_activate (GtkAction     *action,
-                                   GtkRecentInfo *info)
+                                   EvWindow      *window)
 {
-       const gchar *uri;
+       GtkRecentInfo *info;
+       const gchar   *uri;
 
+       info = g_object_get_data (G_OBJECT (action), "gtk-recent-info");
+       g_assert (info != NULL);
+       
        uri = gtk_recent_info_get_uri (info);
        
-       ev_application_open_uri (EV_APP, uri, NULL,
-                                GDK_CURRENT_TIME, NULL);
+       ev_application_open_uri_at_dest (EV_APP, uri,
+                                        gtk_window_get_screen (GTK_WINDOW (window)),
+                                        NULL, 0,
+                                        GDK_CURRENT_TIME);
 }
 #else
 static void
@@ -1144,7 +1197,7 @@ ev_window_cmd_recent_file_activate (GtkAction *action,
 
        uri = egg_recent_item_get_uri (item);
 
-       ev_application_open_uri (EV_APP, -1, uri, NULL,
+       ev_application_open_uri (EV_APP, uri, NULL,
                                 GDK_CURRENT_TIME, NULL);
        
        g_free (uri);
@@ -1192,6 +1245,47 @@ compare_recent_items (GtkRecentInfo *a, GtkRecentInfo *b)
 }
 #endif /* HAVE_GTK_RECENT */
 
+/*
+ * Doubles underscore to avoid spurious menu accels.
+ */
+static gchar * 
+ev_window_get_recent_file_label (gint index, const gchar *filename)
+{
+       GString *str;
+       gint length;
+       const gchar *p;
+       const gchar *end;
+       g_return_val_if_fail (filename != NULL, NULL);
+       
+       length = strlen (filename);
+       str = g_string_sized_new (length + 10);
+       g_string_printf (str, "_%d.  ", index);
+
+       p = filename;
+       end = filename + length;
+       while (p != end)
+       {
+               const gchar *next;
+               next = g_utf8_next_char (p);
+               switch (*p)
+               {
+                       case '_':
+                               g_string_append (str, "__");
+                               break;
+                       default:
+                               g_string_append_len (str, p, next - p);
+                               break;
+               }
+               p = next;
+       }
+       return g_string_free (str, FALSE);
+}
+
 static void
 ev_window_setup_recent (EvWindow *ev_window)
 {
@@ -1232,21 +1326,22 @@ ev_window_setup_recent (EvWindow *ev_window)
                        continue;
 
                action_name = g_strdup_printf ("RecentFile%u", i++);
-               label = g_strdup_printf ("_%d.  %s",
-                                        n_items + 1,
-                                        gtk_recent_info_get_display_name (info));
+               label = ev_window_get_recent_file_label (
+                       n_items + 1, gtk_recent_info_get_display_name (info));
                
                action = g_object_new (GTK_TYPE_ACTION,
                                       "name", action_name,
                                       "label", label,
                                       NULL);
 
-               g_object_weak_ref (G_OBJECT (action),
-                                  (GWeakNotify) gtk_recent_info_unref,
-                                  gtk_recent_info_ref (info));
+               g_object_set_data_full (G_OBJECT (action),
+                                       "gtk-recent-info",
+                                       gtk_recent_info_ref (info),
+                                       (GDestroyNotify) gtk_recent_info_unref);
+               
                g_signal_connect (G_OBJECT (action), "activate",
                                  G_CALLBACK (ev_window_cmd_recent_file_activate),
-                                 (gpointer) info);
+                                 (gpointer) ev_window);
 
                gtk_action_group_add_action (ev_window->priv->recent_action_group,
                                             action);
@@ -1434,9 +1529,18 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
                                    gint       response,
                                    EvWindow  *window)
 {
-       EvBackend     document_type;
-       gboolean      export_to_ps = TRUE;
-       GtkPrintPages print_pages;
+       EvPrintRange  *ranges = NULL;
+       EvPrintPageSet page_set;
+       EvPageCache   *page_cache;
+       gint           n_ranges = 0;
+       gint           copies;
+       gboolean       collate;
+       gboolean       reverse;
+       gdouble        scale;
+       gint           current_page;
+       gint           width;
+       gint           height;
+       GtkPrintPages  print_pages;
        
        if (response != GTK_RESPONSE_OK) {
                gtk_widget_destroy (GTK_WIDGET (dialog));
@@ -1459,32 +1563,7 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
        window->priv->print_page_setup = g_object_ref (
                gtk_print_unix_dialog_get_page_setup (GTK_PRINT_UNIX_DIALOG (dialog)));
 
-       document_type = ev_document_factory_get_backend (window->priv->document);
-       print_pages = gtk_print_settings_get_print_pages (window->priv->print_settings);
-       
-       if (print_pages == GTK_PRINT_PAGES_ALL) {
-               switch (document_type) {
-                       case EV_BACKEND_PDF:
-                               /* Export to ps when printing to file */
-                               if (gtk_print_settings_has_key (window->priv->print_settings,
-                                                               GTK_PRINT_SETTINGS_OUTPUT_URI)) {
-                                       export_to_ps = TRUE;
-                               } else {
-                                       export_to_ps = !gtk_printer_accepts_pdf (window->priv->printer);
-                               }
-
-                               break;
-                       case EV_BACKEND_PS:
-                               export_to_ps = FALSE;
-                               break;
-                       default:
-                               export_to_ps = TRUE;
-                               break;
-               }
-       }
-
-       if ((export_to_ps || document_type == EV_BACKEND_PS) &&
-           !gtk_printer_accepts_ps (window->priv->printer)) {
+       if (!gtk_printer_accepts_ps (window->priv->printer)) {
                GtkWidget *msgdialog;
 
                msgdialog = gtk_message_dialog_new (GTK_WINDOW (dialog),
@@ -1499,65 +1578,59 @@ ev_window_print_dialog_response_cb (GtkDialog *dialog,
                return FALSE;
        }
 
-       if (export_to_ps) {
-               EvPrintRange *ranges = NULL;
-               EvPageCache  *page_cache;
-               gint          n_ranges = 0;
-               gint          current_page;
-               gint          width;
-               gint          height;
-
-               ev_window_clear_print_job (window);
-
-               current_page =
-                       gtk_print_unix_dialog_get_current_page (GTK_PRINT_UNIX_DIALOG (dialog));
-
-               switch (print_pages) {
-                       case GTK_PRINT_PAGES_CURRENT:
-                               ranges = g_new0 (EvPrintRange, 1);
-
-                               ranges->start = current_page;
-                               ranges->end = current_page;
-                               n_ranges = 1;
-                               
-                               break;
-                       case GTK_PRINT_PAGES_RANGES: {
-                               GtkPageRange *page_range;
-
-                               page_range = gtk_print_settings_get_page_ranges (window->priv->print_settings,
-                                                                                &n_ranges);
-                               if (n_ranges > 0)
-                                       ranges = g_memdup (page_range, n_ranges * sizeof (GtkPageRange));
-                       }
-                               break;
-                       default:
-                               break;
-               }
-                               
-               page_cache = ev_page_cache_get (window->priv->document);
-               ev_page_cache_get_size (page_cache,
-                                       current_page,
-                                       0, 1.0,
-                                       &width, &height);
+       ev_window_clear_print_job (window);
        
-               window->priv->print_job =
-                       ev_job_print_new (window->priv->document,
-                                         ranges, n_ranges,
-                                         (gdouble)width,
-                                         (gdouble)height);
+       current_page = gtk_print_unix_dialog_get_current_page (GTK_PRINT_UNIX_DIALOG (dialog));
+       print_pages = gtk_print_settings_get_print_pages (window->priv->print_settings);
+       
+       switch (print_pages) {
+       case GTK_PRINT_PAGES_CURRENT:
+               ranges = g_new0 (EvPrintRange, 1);
                
-               g_signal_connect (window->priv->print_job, "finished",
-                                 G_CALLBACK (ev_window_print_job_cb),
-                                 window);
-               /* The priority doesn't matter for this job */
-               ev_job_queue_add_job (window->priv->print_job, EV_JOB_PRIORITY_LOW);
-       } else {
-               gchar *filename;
-
-               filename = g_filename_from_uri (window->priv->uri, NULL, NULL);
-               ev_window_print_send (window, filename);
-               g_free (filename);
+               ranges->start = current_page;
+               ranges->end = current_page;
+               n_ranges = 1;
+                               
+               break;
+       case GTK_PRINT_PAGES_RANGES: {
+               GtkPageRange *page_range;
+               
+               page_range = gtk_print_settings_get_page_ranges (window->priv->print_settings,
+                                                                &n_ranges);
+               if (n_ranges > 0)
+                       ranges = g_memdup (page_range, n_ranges * sizeof (GtkPageRange));
+       }
+               break;
+       default:
+               break;
        }
+
+       page_set = (EvPrintPageSet)gtk_print_settings_get_page_set (window->priv->print_settings);
+
+       scale = gtk_print_settings_get_scale (window->priv->print_settings) * 0.01;
+       page_cache = ev_page_cache_get (window->priv->document);
+       ev_page_cache_get_size (page_cache,
+                               current_page,
+                               0, scale,
+                               &width, &height);
+       
+       copies = gtk_print_settings_get_n_copies (window->priv->print_settings);
+       collate = gtk_print_settings_get_collate (window->priv->print_settings);
+       reverse = gtk_print_settings_get_reverse (window->priv->print_settings);
+       
+       window->priv->print_job = ev_job_print_new (window->priv->document,
+                                                   (gdouble)width,
+                                                   (gdouble)height,
+                                                   ranges, n_ranges,
+                                                   page_set,
+                                                   copies, collate,
+                                                   reverse);
+       
+       g_signal_connect (window->priv->print_job, "finished",
+                         G_CALLBACK (ev_window_print_job_cb),
+                         window);
+       /* The priority doesn't matter for this job */
+       ev_job_queue_add_job (window->priv->print_job, EV_JOB_PRIORITY_LOW);
        
        gtk_widget_destroy (GTK_WIDGET (dialog));
        window->priv->print_dialog = NULL;
@@ -1609,7 +1682,8 @@ ev_window_print_range (EvWindow *ev_window, int first_page, int last_page)
                                                       GTK_PRINT_CAPABILITY_COLLATE |
                                                       GTK_PRINT_CAPABILITY_REVERSE |
                                                       GTK_PRINT_CAPABILITY_SCALE |
-                                                      GTK_PRINT_CAPABILITY_GENERATE_PS);
+                                                      GTK_PRINT_CAPABILITY_GENERATE_PS |
+                                                      GTK_PRINT_CAPABILITY_GENERATE_PDF);
        gtk_print_unix_dialog_set_current_page (GTK_PRINT_UNIX_DIALOG (dialog),
                                                current_page);
        
@@ -2004,9 +2078,12 @@ fullscreen_popup_size_request_cb (GtkWidget *popup, GtkRequisition *req, EvWindo
 }
 
 static gboolean
-fullscreen_timeout_cb (gpointer data)
+fullscreen_timeout_cb (EvWindow *window)
 {
-       EvWindow *window = EV_WINDOW (data);
+       EvView *view = EV_VIEW (window->priv->view);
+
+       if (!view || !ev_view_get_fullscreen (EV_VIEW (view)))
+               return FALSE;
        
        update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, FALSE);
        ev_view_hide_cursor (EV_VIEW (window->priv->view));
@@ -2023,7 +2100,7 @@ fullscreen_set_timeout (EvWindow *window)
        }
        
        window->priv->fullscreen_timeout_id = 
-           g_timeout_add (FULLSCREEN_TIMEOUT, fullscreen_timeout_cb, window);
+           g_timeout_add (FULLSCREEN_TIMEOUT, (GSourceFunc)fullscreen_timeout_cb, window);
 
        update_chrome_flag (window, EV_CHROME_FULLSCREEN_TOOLBAR, TRUE);
        update_chrome_visibility (window);
@@ -2851,7 +2928,8 @@ ev_window_cmd_help_about (GtkAction *action, EvWindow *ev_window)
                "Marco Pesenti Gritti <marco@gnome.org>",
                "Nickolay V. Shmyrev <nshmyrev@yandex.ru>",
                "Bryan Clark <clarkbw@gnome.org>",
-               "Carlos Garcia Campos  <carlosgc@gnome.org>",
+               "Carlos Garcia Campos <carlosgc@gnome.org>",
+               "Wouter Bolsterlee <wbolster@gnome.org>",
                NULL
        };
 
@@ -3538,7 +3616,9 @@ drag_data_received_cb (GtkWidget *widget, GdkDragContext *context,
 
                gnome_vfs_uri_list_free (uri_list);
                
-               ev_application_open_uri_list (EV_APP, uris, 0);
+               ev_application_open_uri_list (EV_APP, uris,
+                                             gtk_widget_get_screen (widget),
+                                             0);
                
                g_slist_free (uris);
        }
@@ -3598,9 +3678,9 @@ set_action_properties (GtkActionGroup *action_group)
        GtkAction *action;
 
        action = gtk_action_group_get_action (action_group, "GoPreviousPage");
+       g_object_set (action, "is-important", TRUE, NULL);
        /*translators: this is the label for toolbar button*/
        g_object_set (action, "short_label", _("Previous"), NULL);
-       g_object_set (action, "is-important", TRUE, NULL);
 
        action = gtk_action_group_get_action (action_group, "GoNextPage");
        g_object_set (action, "is-important", TRUE, NULL);
@@ -3610,22 +3690,18 @@ set_action_properties (GtkActionGroup *action_group)
        action = gtk_action_group_get_action (action_group, "ViewZoomIn");
        /*translators: this is the label for toolbar button*/
        g_object_set (action, "short_label", _("Zoom In"), NULL);
-       action = gtk_action_group_get_action (action_group, "ViewZoomIn");
 
        action = gtk_action_group_get_action (action_group, "ViewZoomOut");
        /*translators: this is the label for toolbar button*/
        g_object_set (action, "short_label", _("Zoom Out"), NULL);
-       action = gtk_action_group_get_action (action_group, "ViewZoomIn");
 
        action = gtk_action_group_get_action (action_group, "ViewBestFit");
        /*translators: this is the label for toolbar button*/
        g_object_set (action, "short_label", _("Best Fit"), NULL);
-       action = gtk_action_group_get_action (action_group, "ViewZoomIn");
 
        action = gtk_action_group_get_action (action_group, "ViewPageWidth");
        /*translators: this is the label for toolbar button*/
        g_object_set (action, "short_label", _("Fit Width"), NULL);
-       action = gtk_action_group_get_action (action_group, "ViewZoomIn");
 
        action = gtk_action_group_get_action (action_group, "LeaveFullscreen");
        g_object_set (action, "is-important", TRUE, NULL);
@@ -3722,7 +3798,7 @@ window_configure_event_cb (EvWindow *window, GdkEventConfigure *event, gpointer
 {
        char *uri = window->priv->uri;
        GdkWindowState state;
-       int x, y, width, height;
+       int x, y, width, height, document_width, document_height;
 
        state = gdk_window_get_state (GTK_WIDGET (window)->window);
 
@@ -3730,11 +3806,19 @@ 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);
 
-               if (!ev_window_is_empty (window)) {
+               if (!ev_window_is_empty (window) && window->priv->page_cache) {
+                       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);                        
                        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);
+                       ev_metadata_manager_set_double (uri, "window_width_ratio", 
+                                                       (double)width/document_width);
+                       ev_metadata_manager_set_double (uri, "window_height_ratio", 
+                                                       (double)height/document_height);
                }
        }
 
@@ -3807,6 +3891,7 @@ open_remote_link (EvWindow *window, EvLinkAction *action)
        g_free (dir);
 
        ev_application_open_uri_at_dest (EV_APP, uri,
+                                        gtk_window_get_screen (GTK_WINDOW (window)),
                                         ev_link_action_get_dest (action),
                                         0,
                                         GDK_CURRENT_TIME);
@@ -3831,6 +3916,8 @@ do_action_named (EvWindow *window, EvLinkAction *action)
                ev_window_cmd_focus_page_selector (NULL, window);
        } else if (g_ascii_strcasecmp (name, "Find") == 0) {
                ev_window_cmd_edit_find (NULL, window);
+       } else if (g_ascii_strcasecmp (name, "Close") == 0) {
+               ev_window_cmd_file_close_window (NULL, window);
        } else {
                g_warning ("Unimplemented named action: %s, please post a "
                           "bug report in Evince bugzilla "
@@ -4007,6 +4094,8 @@ ev_window_init (EvWindow *ev_window)
                          G_CALLBACK (window_configure_event_cb), NULL);
        g_signal_connect (ev_window, "window_state_event",
                          G_CALLBACK (window_state_event_cb), NULL);
+       g_signal_connect (ev_window, "notify",
+                         G_CALLBACK (fullscreen_timeout_cb), NULL);
 
        ev_window->priv = EV_WINDOW_GET_PRIVATE (ev_window);