]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-window.c
Move view drag and drop stuff to ev-view.
[evince.git] / shell / ev-window.c
index 8f2d8de2ebc841973d1f6afac1ab70ef56ebf8df..ec979874bdba626c640959973a1e75d2e7f18358 100644 (file)
@@ -188,11 +188,6 @@ struct _EvWindowPrivate {
 #endif
 };
 
-static const GtkTargetEntry ev_drop_types[] = {
-       { "text/uri-list", 0, 0 }
-};
-
-
 #define EV_WINDOW_GET_PRIVATE(object) \
        (G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_WINDOW, EvWindowPrivate))
 
@@ -265,6 +260,20 @@ static gboolean fullscreen_leave_notify_cb                 (GtkWidget *widget,
 
 G_DEFINE_TYPE (EvWindow, ev_window, GTK_TYPE_WINDOW)
 
+static gdouble
+ev_window_get_screen_dpi (EvWindow *ev_window)
+{
+       GdkScreen *screen;
+       gdouble    xdpi, ydpi;
+
+       screen = gtk_window_get_screen (GTK_WINDOW (ev_window));
+
+       xdpi = 25.4 * gdk_screen_get_width (screen) / gdk_screen_get_width_mm (screen);
+       ydpi = 25.4 * gdk_screen_get_height (screen) / gdk_screen_get_height_mm (screen);
+       
+       return (xdpi + ydpi) / 2.0;
+}
+
 static void
 ev_window_set_action_sensitive (EvWindow   *ev_window,
                                const char *name,
@@ -425,6 +434,7 @@ ev_window_update_actions (EvWindow *ev_window)
                                                      ZOOM_CONTROL_ACTION);
 
                real_zoom = ev_view_get_zoom (EV_VIEW (ev_window->priv->view));
+               real_zoom *= 72.0 / ev_window_get_screen_dpi (ev_window);
                zoom = ephy_zoom_get_nearest_zoom_level (real_zoom);
 
                ephy_zoom_action_set_zoom_level (EPHY_ZOOM_ACTION (action), zoom);
@@ -649,10 +659,18 @@ 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)) {
-               new_page = CLAMP (g_value_get_int (&page), 0, ev_page_cache_get_n_pages (window->priv->page_cache) - 1);
+               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 (new_page == n_pages - 1)
+                       new_page = 0;
                ev_page_cache_set_current_page (window->priv->page_cache,
                                                new_page);
                g_value_unset (&page);
@@ -810,7 +828,11 @@ setup_view_from_metadata (EvWindow *window)
        /* Zoom */
        if (ev_metadata_manager_get (uri, "zoom", &zoom, FALSE) &&
            ev_view_get_sizing_mode (view) == EV_SIZING_FREE) {
-               ev_view_set_zoom (view, g_value_get_double (&zoom), FALSE);
+               gdouble zoom_value;
+
+               zoom_value = g_value_get_double (&zoom);
+               zoom_value *= ev_window_get_screen_dpi (window) / 72.0;
+               ev_view_set_zoom (view, zoom_value, FALSE);
                g_value_unset (&zoom);
        }
 
@@ -2067,7 +2089,9 @@ ev_window_cmd_file_properties (GtkAction *action, EvWindow *ev_window)
                                              GTK_WINDOW (ev_window));
        }
 
+       ev_document_fc_mutex_lock ();
        gtk_widget_show (ev_window->priv->properties);
+       ev_document_fc_mutex_unlock ();
 }
                                        
 static void
@@ -3025,8 +3049,11 @@ ev_window_zoom_changed_cb (EvView *view, GParamSpec *pspec, EvWindow *ev_window)
         ev_window_update_actions (ev_window);
 
        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));
+               gdouble zoom;
+
+               zoom = ev_view_get_zoom (view);
+               zoom *= 72.0 / ev_window_get_screen_dpi (ev_window);
+               ev_metadata_manager_set_double (ev_window->priv->uri, "zoom", zoom);
        }
 }
 
@@ -3459,7 +3486,9 @@ zoom_control_changed_cb (EphyZoomAction *action,
        ev_view_set_sizing_mode (EV_VIEW (ev_window->priv->view), mode);
        
        if (mode == EV_SIZING_FREE) {
-               ev_view_set_zoom (EV_VIEW (ev_window->priv->view), zoom, FALSE);
+               ev_view_set_zoom (EV_VIEW (ev_window->priv->view),
+                                 zoom * ev_window_get_screen_dpi (ev_window) / 72.0,
+                                 FALSE);
        }
 }
 
@@ -3678,7 +3707,11 @@ static const GtkActionEntry entries[] = {
         /* Edit menu */
         { "EditCopy", GTK_STOCK_COPY, NULL, "<control>C", NULL,
           G_CALLBACK (ev_window_cmd_edit_copy) },
-       { "EditSelectAll", NULL, N_("Select _All"), "<control>A", NULL,
+#ifdef HAVE_GTK_RECENT
+       { "EditSelectAll", GTK_STOCK_SELECT_ALL, N_("Select _All"), "<control>A", NULL,
+#else
+       { "EditSelectAll", NULL, N_("Select _All"), "<control>A", NULL,
+#endif /* HAVE_GTK_RECENT */
          G_CALLBACK (ev_window_cmd_edit_select_all) },
         { "EditFind", GTK_STOCK_FIND, N_("_Find..."), "<control>F",
           N_("Find a word or phrase in the document"),
@@ -3826,35 +3859,6 @@ static const GtkActionEntry attachment_popup_entries [] = {
          NULL, G_CALLBACK (ev_attachment_popup_cmd_save_attachment_as) },
 };
 
-static void
-drag_data_received_cb (GtkWidget *widget, GdkDragContext *context,
-                      gint x, gint y, GtkSelectionData *selection_data,
-                      guint info, guint time, gpointer gdata)
-{
-       GList  *uri_list = NULL;
-       GSList *uris = NULL;
-       gchar  *uri;
-
-       uri_list = gnome_vfs_uri_list_parse ((gchar *) selection_data->data);
-
-       if (uri_list) {
-               while (uri_list) {
-                       uri = gnome_vfs_uri_to_string (uri_list->data, GNOME_VFS_URI_HIDE_NONE);
-                       uris = g_slist_append (uris, (gpointer) uri);
-                       
-                       uri_list = g_list_next (uri_list);
-               }
-
-               gnome_vfs_uri_list_free (uri_list);
-               
-               ev_application_open_uri_list (EV_APP, uris,
-                                             gtk_widget_get_screen (widget),
-                                             0);
-               
-               g_slist_free (uris);
-       }
-}
-
 static void
 activate_link_cb (EvPageAction *page_action, EvLink *link, EvWindow *window)
 {
@@ -3863,7 +3867,7 @@ activate_link_cb (EvPageAction *page_action, EvLink *link, EvWindow *window)
 }
 
 static gboolean
-activate_label_cb (EvPageAction *page_action, char *label, EvWindow *window)
+activate_label_cb (EvPageAction *page_action, const gchar *label, EvWindow *window)
 {
        g_return_val_if_fail (EV_IS_WINDOW (window), FALSE);
 
@@ -4110,14 +4114,7 @@ launch_action (EvWindow *window, EvLinkAction *action)
 static void
 launch_external_uri (EvWindow *window, EvLinkAction *action)
 {
-       const char *uri;
-       char *escaped;
-
-       uri = ev_link_action_get_uri (action);
-       escaped = gnome_vfs_escape_host_and_path_string (uri);
-
-       gnome_vfs_url_show (escaped);
-       g_free (escaped);
+       gnome_vfs_url_show (ev_link_action_get_uri (action));
 }
 
 static void
@@ -4638,19 +4635,7 @@ ev_window_init (EvWindow *ev_window)
        /* Give focus to the document view */
        gtk_widget_grab_focus (ev_window->priv->view);
 
-       /* Drag and Drop */
-       gtk_drag_dest_unset (GTK_WIDGET (ev_window->priv->view));
-       gtk_drag_dest_set (GTK_WIDGET (ev_window->priv->view),
-                          GTK_DEST_DEFAULT_ALL,
-                          ev_drop_types,
-                          sizeof (ev_drop_types) / sizeof (ev_drop_types[0]),
-                          GDK_ACTION_COPY);
-       g_signal_connect_swapped (G_OBJECT (ev_window->priv->view), "drag-data-received",
-                                 G_CALLBACK (drag_data_received_cb),
-                                 ev_window);
-
        /* Set it user interface params */
-
        ev_window_setup_recent (ev_window);
 
        setup_chrome_from_metadata (ev_window);