]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Scroll pages in page entry with mouse wheel. Fixes bug #324122. Thanks to
[evince.git] / shell / ev-view.c
index ed55a110b78c8a8dd6c6ceee11dee081b5a094b9..bbfeecfa64d2b4acb153f331b32813a44120a07a 100644 (file)
@@ -1154,21 +1154,26 @@ static void
 goto_fitr_dest (EvView *view, EvLinkDest *dest)
 {
        EvPoint doc_point;
 goto_fitr_dest (EvView *view, EvLinkDest *dest)
 {
        EvPoint doc_point;
-       double zoom;
+       gdouble zoom, left, top;
+       gboolean change_left, change_top;
+
+       left = ev_link_dest_get_left (dest, &change_left);
+       top = ev_link_dest_get_top (dest, &change_top);
 
 
-       zoom = zoom_for_size_best_fit (ev_link_dest_get_right (dest) - ev_link_dest_get_left (dest),
-                                      ev_link_dest_get_bottom (dest) - ev_link_dest_get_top (dest),
+       zoom = zoom_for_size_best_fit (ev_link_dest_get_right (dest) - left,
+                                      ev_link_dest_get_bottom (dest) - top,
                                       ev_view_get_width (view),
                                       ev_view_get_height (view), 0, 0);
 
        ev_view_set_sizing_mode (view, EV_SIZING_FREE);
        ev_view_set_zoom (view, zoom, FALSE);
 
                                       ev_view_get_width (view),
                                       ev_view_get_height (view), 0, 0);
 
        ev_view_set_sizing_mode (view, EV_SIZING_FREE);
        ev_view_set_zoom (view, zoom, FALSE);
 
-       doc_point.x = ev_link_dest_get_left (dest);
-       doc_point.y = ev_link_dest_get_top (dest);
+       doc_point.x = change_left ? left : 0;
+       doc_point.y = change_top ? top : 0;
        
        view->current_page = ev_link_dest_get_page (dest);
        
        view->current_page = ev_link_dest_get_page (dest);
-       view->pending_point = doc_point;
+       if (change_left || change_top)
+               view->pending_point = doc_point;
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
@@ -1179,12 +1184,14 @@ goto_fitv_dest (EvView *view, EvLinkDest *dest)
 {
        EvPoint doc_point;
        int doc_width, doc_height, page;
 {
        EvPoint doc_point;
        int doc_width, doc_height, page;
-       double zoom;
+       double zoom, left;
+       gboolean change_left;
 
        page = ev_link_dest_get_page (dest);
        ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height);
 
 
        page = ev_link_dest_get_page (dest);
        ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height);
 
-       doc_point.x = ev_link_dest_get_left (dest);
+       left = ev_link_dest_get_left (dest, &change_left);
+       doc_point.x = change_left ? left : 0;
        doc_point.y = 0;
 
        zoom = zoom_for_size_fit_height (doc_width - doc_point.x , doc_height,
        doc_point.y = 0;
 
        zoom = zoom_for_size_fit_height (doc_width - doc_point.x , doc_height,
@@ -1195,7 +1202,8 @@ goto_fitv_dest (EvView *view, EvLinkDest *dest)
        ev_view_set_zoom (view, zoom, FALSE);
 
        view->current_page = page;
        ev_view_set_zoom (view, zoom, FALSE);
 
        view->current_page = page;
-       view->pending_point = doc_point;
+       if (change_left)
+               view->pending_point = doc_point;
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
@@ -1206,15 +1214,18 @@ goto_fith_dest (EvView *view, EvLinkDest *dest)
 {
        EvPoint doc_point;
        int doc_width, doc_height, page;
 {
        EvPoint doc_point;
        int doc_width, doc_height, page;
-       double zoom;
+       gdouble zoom, top;
+       gboolean change_top;
 
        page = ev_link_dest_get_page (dest);
        ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height);
 
 
        page = ev_link_dest_get_page (dest);
        ev_page_cache_get_size (view->page_cache, page, 0, 1.0, &doc_width, &doc_height);
 
+       top = ev_link_dest_get_top (dest, &change_top);
+
        doc_point.x = 0;
        doc_point.x = 0;
-       doc_point.y = ev_link_dest_get_top (dest);
+       doc_point.y = change_top ? top : 0;
 
 
-       zoom = zoom_for_size_fit_width (doc_width, ev_link_dest_get_top (dest),
+       zoom = zoom_for_size_fit_width (doc_width, top,
                                        ev_view_get_width (view),
                                        ev_view_get_height (view), 0);
 
                                        ev_view_get_width (view),
                                        ev_view_get_height (view), 0);
 
@@ -1222,7 +1233,8 @@ goto_fith_dest (EvView *view, EvLinkDest *dest)
        ev_view_set_zoom (view, zoom, FALSE);
 
        view->current_page = page;
        ev_view_set_zoom (view, zoom, FALSE);
 
        view->current_page = page;
-       view->pending_point = doc_point;
+       if (change_top)
+               view->pending_point = doc_point;
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
@@ -1255,21 +1267,26 @@ goto_xyz_dest (EvView *view, EvLinkDest *dest)
 {
        EvPoint doc_point;
        gint page;
 {
        EvPoint doc_point;
        gint page;
-       double zoom;
+       gdouble zoom, left, top;
+       gboolean change_zoom, change_left, change_top; 
 
 
-       zoom = ev_link_dest_get_zoom (dest);
+       zoom = ev_link_dest_get_zoom (dest, &change_zoom);
        page = ev_link_dest_get_page (dest);
 
        page = ev_link_dest_get_page (dest);
 
-       if (zoom > 1) {
+       if (change_zoom && zoom > 1) {
                ev_view_set_sizing_mode (view, EV_SIZING_FREE);
                ev_view_set_zoom (view, zoom, FALSE);
        }
 
                ev_view_set_sizing_mode (view, EV_SIZING_FREE);
                ev_view_set_zoom (view, zoom, FALSE);
        }
 
-       doc_point.x = ev_link_dest_get_left (dest);
-       doc_point.y = ev_link_dest_get_top (dest);
+       left = ev_link_dest_get_left (dest, &change_left);
+       top = ev_link_dest_get_top (dest, &change_top);
+
+       doc_point.x = change_left ? left : 0;
+       doc_point.y = change_top ? top : 0;
 
        view->current_page = page;
 
        view->current_page = page;
-       view->pending_point = doc_point;
+       if (change_left || change_top)
+               view->pending_point = doc_point;
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
        view->pending_scroll = SCROLL_TO_PAGE_POSITION;
 
        gtk_widget_queue_resize (GTK_WIDGET (view));
@@ -1537,7 +1554,8 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y)
        } else if ((field = ev_view_get_form_field_at_location (view, x, y))) {
                if (field->is_read_only) {
                        if (view->cursor == EV_VIEW_CURSOR_LINK ||
        } else if ((field = ev_view_get_form_field_at_location (view, x, y))) {
                if (field->is_read_only) {
                        if (view->cursor == EV_VIEW_CURSOR_LINK ||
-                           view->cursor == EV_VIEW_CURSOR_IBEAM)
+                           view->cursor == EV_VIEW_CURSOR_IBEAM ||
+                           view->cursor == EV_VIEW_CURSOR_DRAG)
                                ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
                } else if (EV_IS_FORM_FIELD_TEXT (field)) {
                        ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM);
                                ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
                } else if (EV_IS_FORM_FIELD_TEXT (field)) {
                        ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM);
@@ -1548,7 +1566,8 @@ ev_view_handle_cursor_over_xy (EvView *view, gint x, gint y)
                ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM);
        } else {
                if (view->cursor == EV_VIEW_CURSOR_LINK ||
                ev_view_set_cursor (view, EV_VIEW_CURSOR_IBEAM);
        } else {
                if (view->cursor == EV_VIEW_CURSOR_LINK ||
-                   view->cursor == EV_VIEW_CURSOR_IBEAM)
+                   view->cursor == EV_VIEW_CURSOR_IBEAM ||
+                   view->cursor == EV_VIEW_CURSOR_DRAG)
                        ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
        }
 }
                        ev_view_set_cursor (view, EV_VIEW_CURSOR_NORMAL);
        }
 }
@@ -4257,7 +4276,9 @@ ev_view_set_zoom (EvView   *view,
        else
                scale = factor;
 
        else
                scale = factor;
 
-       scale = CLAMP (scale, view->min_scale, view->max_scale);
+       scale = CLAMP (scale,
+                      view->sizing_mode == EV_SIZING_FREE ? view->min_scale : 0,
+                      view->max_scale);
 
        if (ABS (view->scale - scale) < EPSILON)
                return;
 
        if (ABS (view->scale - scale) < EPSILON)
                return;