]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
sv.po: Updated Swedish translation
[evince.git] / shell / ev-window.c
index 97858d7e37835d0f1bad7bd7a45f8e4faf07bc5b..f950c9b650c103fb9739410909eee90d3ac7ab56 100644 (file)
@@ -43,7 +43,9 @@
 #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"
@@ -61,6 +63,7 @@
 #include "ev-document-images.h"
 #include "ev-document-links.h"
 #include "ev-document-thumbnails.h"
+#include "ev-document-type-builtins.h"
 #include "ev-file-exporter.h"
 #include "ev-file-helpers.h"
 #include "ev-file-monitor.h"
@@ -86,6 +89,7 @@
 #include "ev-utils.h"
 #include "ev-keyring.h"
 #include "ev-view.h"
+#include "ev-view-type-builtins.h"
 #include "ev-window.h"
 #include "ev-window-title.h"
 #include "ev-print-operation.h"
@@ -181,7 +185,6 @@ struct _EvWindowPrivate {
        char *uri;
        glong uri_mtime;
        char *local_uri;
-       EvLinkDest *dest;
        gboolean unlink_temp_file;
        gboolean in_reload;
        EvFileMonitor *monitor;
@@ -193,6 +196,11 @@ struct _EvWindowPrivate {
        EvWindowPageMode page_mode;
        EvWindowTitle *title;
 
+       /* Load params */
+       EvLinkDest       *dest;
+       gchar            *search_string;
+       EvWindowRunMode   window_mode;
+
        EvJob            *load_job;
        EvJob            *reload_job;
        EvJob            *thumbnail_job;
@@ -334,8 +342,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;
@@ -358,10 +367,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);
@@ -370,7 +381,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;
        }
@@ -380,6 +391,7 @@ 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);
@@ -875,29 +887,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)
 {
@@ -913,17 +902,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),
@@ -964,57 +954,43 @@ 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, };
-       GValue maximized = { 0, };
-       GValue x = { 0, };
-       GValue y = { 0, };
 
-       if (ev_metadata_manager_get (uri, "window_maximized", &maximized, FALSE)) {
-               if (g_value_get_boolean (&maximized)) {
-                       gtk_window_maximize (GTK_WINDOW (window));
-                       g_value_unset (&maximized);
-                       return;
-               } else {
-                       gtk_window_unmaximize (GTK_WINDOW (window));
-               }
-               g_value_unset (&maximized);
+       /* 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);
        }
 
-       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));
-               g_value_unset (&x);
-               g_value_unset (&y);
-       }
+       setup_sidebar_from_metadata (window);
 
-        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 (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 (window->priv->page_cache &&
-           ev_metadata_manager_get (uri, "window_width_ratio", &width_ratio, FALSE) &&
+       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;
-               
+               gint       document_width;
+               gint       document_height;
                GdkScreen *screen;
-               
-               gint request_width;
-               gint request_height;
+               gint       request_width;
+               gint       request_height;
 
                ev_page_cache_get_max_width (window->priv->page_cache, 
                                             0, 1.0,
@@ -1042,34 +1018,62 @@ setup_size_from_metadata (EvWindow *window)
 }
 
 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 sizing_mode = { 0, };
-       GValue zoom = { 0, };
-       GValue continuous = { 0, };
-       GValue dual_page = { 0, };
-       GValue presentation = { 0, };
-       GValue fullscreen = { 0, };
-       GValue rotation = { 0, };
+       GValue width = { 0, };
+       GValue height = { 0, };
        GValue maximized = { 0, };
+       GValue x = { 0, };
+       GValue y = { 0, };
 
-       /* Maximized */
        if (ev_metadata_manager_get (uri, "window_maximized", &maximized, FALSE)) {
                if (g_value_get_boolean (&maximized)) {
                        gtk_window_maximize (GTK_WINDOW (window));
+                       g_value_unset (&maximized);
+                       return;
                } else {
                        gtk_window_unmaximize (GTK_WINDOW (window));
                }
                g_value_unset (&maximized);
        }
 
+       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));
+               g_value_unset (&x);
+               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);
+       }
+}
+
+static void
+setup_view_from_metadata (EvWindow *window)
+{
+       EvView *view = EV_VIEW (window->priv->view);
+       gchar *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, };
+
        /* Sizing mode */
        if (ev_metadata_manager_get (uri, "sizing_mode", &sizing_mode, FALSE)) {
                enum_value = g_enum_get_value_by_nick
-                       (EV_SIZING_MODE_CLASS, g_value_get_string (&sizing_mode));
+                       (g_type_class_peek (EV_TYPE_SIZING_MODE), g_value_get_string (&sizing_mode));
                g_value_unset (&sizing_mode);
                ev_view_set_sizing_mode (view, enum_value->value);
        }
@@ -1244,10 +1248,6 @@ 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_page_cache_get_n_pages (ev_window->priv->page_cache) > 0) {
                ev_view_set_document (view, document);
        } else {
@@ -1367,8 +1367,10 @@ ev_window_load_job_cb (EvJob *job,
        /* Success! */
        if (!ev_job_is_failed (job)) {
                ev_window_set_document (ev_window, document);
+
+               setup_document_from_metadata (ev_window);
                
-               if (job_load->mode != EV_WINDOW_MODE_PREVIEW) {
+               if (ev_window->priv->window_mode != EV_WINDOW_MODE_PREVIEW) {
                        setup_view_from_metadata (ev_window);
                }
 
@@ -1388,17 +1390,23 @@ ev_window_load_job_cb (EvJob *job,
                                                  flags);
                }
 
-               if (job_load->dest) {
+               if (ev_window->priv->dest) {
                        EvLink *link;
                        EvLinkAction *link_action;
        
-                       link_action = ev_link_action_new_dest (g_object_ref (job_load->dest));
+                       link_action = ev_link_action_new_dest (ev_window->priv->dest);
                        link = ev_link_new (NULL, link_action);
                        ev_view_handle_link (EV_VIEW (ev_window->priv->view), link);
                        g_object_unref (link);
+
+                       /* Already unrefed by ev_link_action
+                        * FIXME: link action should inc dest ref counting
+                        * or not unref it at all
+                        */
+                       ev_window->priv->dest = NULL;
                }
 
-               switch (job_load->mode) {
+               switch (ev_window->priv->window_mode) {
                        case EV_WINDOW_MODE_FULLSCREEN:
                                ev_window_run_fullscreen (ev_window);
                                break;
@@ -1412,15 +1420,18 @@ ev_window_load_job_cb (EvJob *job,
                                break;
                }
 
-               if (job_load->search_string && EV_IS_DOCUMENT_FIND (document)) {
+               if (ev_window->priv->search_string && EV_IS_DOCUMENT_FIND (document)) {
                        ev_window_cmd_edit_find (NULL, ev_window);
                        egg_find_bar_set_search_string (EGG_FIND_BAR (ev_window->priv->find_bar),
-                                                       job_load->search_string);
+                                                       ev_window->priv->search_string);
                }
 
+               g_free (ev_window->priv->search_string);
+               ev_window->priv->search_string = NULL;
+
                /* Create a monitor for the document */
                ev_window->priv->monitor = ev_file_monitor_new (ev_window->priv->uri);
-               g_signal_connect_swapped (G_OBJECT (ev_window->priv->monitor), "changed",
+               g_signal_connect_swapped (ev_window->priv->monitor, "changed",
                                          G_CALLBACK (ev_window_document_changed),
                                          ev_window);
                
@@ -1428,8 +1439,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);
@@ -1476,15 +1486,27 @@ ev_window_reload_job_cb (EvJob    *job,
                         EvWindow *ev_window)
 {
        GtkWidget *widget;
+       gint       page;
 
        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 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;
+       
        /* 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)) {
@@ -1721,9 +1743,9 @@ window_open_file_copy_progress_cb (goffset   n_bytes,
        
        if (!ev_window->priv->message_area)
                return;
-       
+
        fraction = n_bytes / (gdouble)total_bytes;
-       status = g_strdup_printf (_("Downloading document %d%%"),
+       status = g_strdup_printf (_("Downloading document (%d%%)"),
                                  (gint)(fraction * 100));
        
        ev_progress_message_area_set_status (EV_PROGRESS_MESSAGE_AREA (ev_window->priv->message_area),
@@ -1803,6 +1825,7 @@ ev_window_open_uri (EvWindow       *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 ? 
@@ -1813,9 +1836,18 @@ ev_window_open_uri (EvWindow       *ev_window,
                g_free (ev_window->priv->uri);
        ev_window->priv->uri = g_strdup (uri);
 
+       if (ev_window->priv->search_string)
+               g_free (ev_window->priv->search_string);
+       ev_window->priv->search_string = search_string ?
+               g_strdup (search_string) : NULL;
+
+       if (ev_window->priv->dest)
+               g_object_unref (ev_window->priv->dest);
+       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, dest, mode, search_string);
+
+       ev_window->priv->load_job = ev_job_load_new (uri);
        g_signal_connect (ev_window->priv->load_job,
                          "finished",
                          G_CALLBACK (ev_window_load_job_cb),
@@ -1836,7 +1868,7 @@ ev_window_reload_local (EvWindow *ev_window)
        const gchar *uri;
        
        uri = ev_window->priv->local_uri ? ev_window->priv->local_uri : ev_window->priv->uri;
-       ev_window->priv->reload_job = ev_job_load_new (uri, NULL, 0, NULL);
+       ev_window->priv->reload_job = ev_job_load_new (uri);
        g_signal_connect (ev_window->priv->reload_job, "finished",
                          G_CALLBACK (ev_window_reload_job_cb),
                          ev_window);
@@ -1885,7 +1917,7 @@ reload_remote_copy_ready_cb (GFile        *remote,
                if (error->domain != G_IO_ERROR ||
                    error->code != G_IO_ERROR_CANCELLED)
                        ev_window_error_message (ev_window, error,
-                                                "%s", _("Failed to reaload document."));
+                                                "%s", _("Failed to reload document."));
                g_error_free (error);
        } else {
                ev_window_reload_local (ev_window);
@@ -1906,7 +1938,7 @@ reload_remote_copy_progress_cb (goffset   n_bytes,
                return;
        
        fraction = n_bytes / (gdouble)total_bytes;
-       status = g_strdup_printf (_("Downloading document %d%%"),
+       status = g_strdup_printf (_("Downloading document (%d%%)"),
                                  (gint)(fraction * 100));
        
        ev_progress_message_area_set_status (EV_PROGRESS_MESSAGE_AREA (ev_window->priv->message_area),
@@ -1982,9 +2014,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 {
@@ -2309,7 +2351,7 @@ ev_window_setup_recent (EvWindow *ev_window)
                                        gtk_recent_info_ref (info),
                                        (GDestroyNotify) gtk_recent_info_unref);
                
-               g_signal_connect (G_OBJECT (action), "activate",
+               g_signal_connect (action, "activate",
                                  G_CALLBACK (ev_window_cmd_recent_file_activate),
                                  (gpointer) ev_window);
 
@@ -2433,15 +2475,15 @@ window_save_file_copy_progress_cb (goffset n_bytes,
 
        switch (save_type) {
        case EV_SAVE_DOCUMENT:
-               status = g_strdup_printf (_("Uploading document %d%%"),
+               status = g_strdup_printf (_("Uploading document (%d%%)"),
                                          (gint)(fraction * 100));
                break;
        case EV_SAVE_ATTACHMENT:
-               status = g_strdup_printf (_("Uploading attachment %d%%"),
+               status = g_strdup_printf (_("Uploading attachment (%d%%)"),
                                          (gint)(fraction * 100));
                break;
        case EV_SAVE_IMAGE:
-               status = g_strdup_printf (_("Uploading image %d%%"),
+               status = g_strdup_printf (_("Uploading image (%d%%)"),
                                          (gint)(fraction * 100));
                break;
        default:
@@ -2924,13 +2966,13 @@ ev_window_print_range (EvWindow *ev_window,
                ev_window->priv->print_queue = g_queue_new ();
 
        op = ev_print_operation_new (ev_window->priv->document);
-       g_signal_connect (G_OBJECT (op), "begin_print",
+       g_signal_connect (op, "begin_print",
                          G_CALLBACK (ev_window_print_operation_begin_print),
                          (gpointer)ev_window);
-       g_signal_connect (G_OBJECT (op), "status_changed",
+       g_signal_connect (op, "status_changed",
                          G_CALLBACK (ev_window_print_operation_status_changed),
                          (gpointer)ev_window);
-       g_signal_connect (G_OBJECT (op), "done",
+       g_signal_connect (op, "done",
                          G_CALLBACK (ev_window_print_operation_done),
                          (gpointer)ev_window);
 
@@ -3084,7 +3126,7 @@ ev_window_cmd_file_close_window (GtkAction *action, EvWindow *ev_window)
                                GTK_RESPONSE_NO,
                                GTK_STOCK_CANCEL,
                                GTK_RESPONSE_CANCEL,
-                               _("Close after _Printing"),
+                               _("Close _after Printing"),
                                GTK_RESPONSE_YES,
                                NULL);
        gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
@@ -4059,7 +4101,7 @@ save_sizing_mode (EvWindow *window)
        GEnumValue *enum_value;
 
        mode = ev_view_get_sizing_mode (EV_VIEW (window->priv->view));
-       enum_value = g_enum_get_value (EV_SIZING_MODE_CLASS, mode);
+       enum_value = g_enum_get_value (g_type_class_peek (EV_TYPE_SIZING_MODE), mode);
 
        if (!ev_window_is_empty (window))
                ev_metadata_manager_set_string (window->priv->uri, "sizing_mode",
@@ -4683,6 +4725,40 @@ zoom_control_changed_cb (EphyZoomAction *action,
        }
 }
 
+static void
+ev_window_drag_data_received (GtkWidget        *widget,
+                             GdkDragContext   *context,
+                             gint              x,
+                             gint              y,
+                             GtkSelectionData *selection_data,
+                             guint             info,
+                             guint             time)
+
+{
+       EvWindow *window = EV_WINDOW (widget);
+       gchar   **uris;
+       gint      i = 0;
+       GSList   *uri_list = NULL;
+
+       uris = gtk_selection_data_get_uris (selection_data);
+       if (!uris) {
+               gtk_drag_finish (context, FALSE, FALSE, time);
+               return;
+       }
+
+       for (i = 0; uris[i]; i++) {
+               uri_list = g_slist_prepend (uri_list, (gpointer) uris[i]);
+       }
+
+       ev_application_open_uri_list (EV_APP, uri_list,
+                                     gtk_window_get_screen (GTK_WINDOW (window)),
+                                     0);
+       gtk_drag_finish (context, TRUE, FALSE, time);
+
+       g_strfreev (uris);
+       g_slist_free (uri_list);
+}
+
 static void
 ev_window_finalize (GObject *object)
 {
@@ -4860,6 +4936,11 @@ ev_window_dispose (GObject *object)
                priv->uri = NULL;
        }
 
+       if (priv->search_string) {
+               g_free (priv->search_string);
+               priv->search_string = NULL;
+       }
+       
        if (priv->dest) {
                g_object_unref (priv->dest);
                priv->dest = NULL;
@@ -4899,6 +4980,7 @@ ev_window_class_init (EvWindowClass *ev_window_class)
 
        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;
 
        g_type_class_add_private (g_object_class, sizeof (EvWindowPrivate));
 }
@@ -6190,10 +6272,17 @@ 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);
+
+       /* Drag and Drop */
+       gtk_drag_dest_set (GTK_WIDGET (ev_window),
+                          GTK_DEST_DEFAULT_ALL,
+                          NULL, 0,
+                          GDK_ACTION_COPY);
+       gtk_drag_dest_add_uri_targets (GTK_WIDGET (ev_window));
 }
 
 /**