]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-view.c
Don't jump on scrolling, fix for the bug #333127.
[evince.git] / shell / ev-view.c
index 11e6479a1dbfa81bcff26aa16f1a98dea12b1bf0..d8a802498de1529a4c8f79733d9f9dbc97a06b1e 100644 (file)
@@ -114,10 +114,7 @@ static void       ev_view_set_scroll_adjustments             (EvView
 static void       add_scroll_binding_keypad                  (GtkBindingSet      *binding_set,
                                                              guint               keyval,
                                                              GdkModifierType modifiers,
-                                                             GtkScrollType       scroll,
-                                                             gboolean            horizontal);
-static void       ev_view_binding_activated                  (EvView             *view,
-                                                             GtkScrollType       scroll,
+                                                             EvScrollType       scroll,
                                                              gboolean            horizontal);
 static void       ensure_rectangle_is_visible                (EvView             *view,
                                                              GdkRectangle       *rect);
@@ -474,7 +471,7 @@ view_update_range_and_current_page (EvView *view)
                                else 
                                        view->end_page = view->start_page;
                        } else {
-                               if (view->current_page - 1 < 0)
+                               if (view->current_page < 1)
                                        view->start_page = view->current_page;
                                else
                                        view->start_page = view->current_page - 1;
@@ -490,6 +487,7 @@ view_update_range_and_current_page (EvView *view)
        current_page = ev_page_cache_get_current_page (view->page_cache);
 
        if (current_page < view->start_page || current_page > view->end_page) {
+               view->current_page = view->start_page;
                ev_page_cache_set_current_page (view->page_cache, view->start_page);
        }
 
@@ -547,32 +545,49 @@ static void
 add_scroll_binding_keypad (GtkBindingSet  *binding_set,
                           guint           keyval,
                           GdkModifierType modifiers,
-                          GtkScrollType   scroll,
+                          EvScrollType    scroll,
                           gboolean        horizontal)
 {
   guint keypad_keyval = keyval - GDK_Left + GDK_KP_Left;
 
   gtk_binding_entry_add_signal (binding_set, keyval, modifiers,
                                 "binding_activated", 2,
-                                GTK_TYPE_SCROLL_TYPE, scroll,
+                                EV_TYPE_SCROLL_TYPE, scroll,
                                G_TYPE_BOOLEAN, horizontal);
   gtk_binding_entry_add_signal (binding_set, keypad_keyval, modifiers,
                                 "binding_activated", 2,
-                                GTK_TYPE_SCROLL_TYPE, scroll,
+                                EV_TYPE_SCROLL_TYPE, scroll,
                                G_TYPE_BOOLEAN, horizontal);
 }
 
 void
 ev_view_scroll (EvView        *view,
-               EvScrollType   scroll)
+               EvScrollType   scroll,
+               gboolean horizontal)
 {
        GtkAdjustment *adjustment;
        double value, increment;
        gboolean first_page = FALSE;
        gboolean last_page = FALSE;
 
+       view->jump_to_find_result = FALSE;
+
+       if (view->presentation) {
+               switch (scroll) {
+                       case EV_SCROLL_STEP_BACKWARD:
+                               ev_view_previous_page (view);
+                               break;
+                       case EV_SCROLL_STEP_FORWARD:
+                               ev_view_next_page (view);
+                               break;
+                       default:
+                               break;
+               }
+               return;
+       }
+
        /* Assign values for increment and vertical adjustment */
-       adjustment = view->vadjustment;
+       adjustment = horizontal ? view->hadjustment : view->vadjustment;
        increment = adjustment->page_size * 0.75;
        value = adjustment->value;
 
@@ -609,64 +624,27 @@ ev_view_scroll (EvView        *view,
                                value = MIN (value + increment, adjustment->upper - adjustment->page_size);
                        }
                        break;
-               default:
-                       break;
-       }
-
-       gtk_adjustment_set_value (adjustment, value);
-}
-
-static void
-ev_view_binding_activated (EvView *view,
-                          GtkScrollType scroll,
-                          gboolean horizontal)
-{
-       GtkAdjustment *adjustment;
-       double value;
-
-       if (view->presentation) {
-               switch (scroll) {
-                       case GTK_SCROLL_STEP_BACKWARD:
-                               ev_view_previous_page (view);
-                               break;
-                       case GTK_SCROLL_STEP_FORWARD:
-                               ev_view_next_page (view);
-                               break;
-                       default:
-                               break;
-               }
-               return;
-       }
-
-       if (horizontal) {
-               adjustment = view->hadjustment;
-       } else {
-               adjustment = view->vadjustment;
-       }
-
-       value = adjustment->value;
-
-       switch (scroll) {
-               case GTK_SCROLL_STEP_BACKWARD:
+               case EV_SCROLL_STEP_BACKWARD:
                        value -= adjustment->step_increment;
                        break;
-               case GTK_SCROLL_STEP_FORWARD:
+               case EV_SCROLL_STEP_FORWARD:
                        value += adjustment->step_increment;
                        break;
-               case GTK_SCROLL_STEP_DOWN:
-                       value -= adjustment->step_increment/10;
+               case EV_SCROLL_STEP_DOWN:
+                       value -= adjustment->step_increment / 10;
                        break;
-               case GTK_SCROLL_STEP_UP:
-                       value += adjustment->step_increment/10;
+               case EV_SCROLL_STEP_UP:
+                       value += adjustment->step_increment / 10;
                        break;
-               default:
+               default:
                        break;
        }
 
        value = CLAMP (value, adjustment->lower,
-                      adjustment->upper - adjustment->page_size);
+                      adjustment->upper - adjustment->page_size);      
 
        gtk_adjustment_set_value (adjustment, value);
+
 }
 
 #define MARGIN 5
@@ -1565,6 +1543,7 @@ ev_view_scroll_event (GtkWidget *widget, GdkEventScroll *event)
                return TRUE;
        }
 
+       view->jump_to_find_result = FALSE;
        /* Shift+Wheel scrolls the in the perpendicular direction */
        if (state & GDK_SHIFT_MASK) {
                if (event->direction == GDK_SCROLL_UP)
@@ -2145,11 +2124,14 @@ draw_one_page (EvView          *view,
        GdkRectangle overlap;
        GdkRectangle real_page_area;
        EvViewSelection *selection;
+       gint current_page;
 
        g_assert (view->document);
+       
        if (! gdk_rectangle_intersect (page_area, expose_area, &overlap))
                return;
-
+       
+       current_page = ev_page_cache_get_current_page (view->page_cache);
        selection = find_selection_for_page (view, page);
        ev_page_cache_get_size (view->page_cache,
                                page, view->rotation,
@@ -2165,7 +2147,8 @@ draw_one_page (EvView          *view,
 
        ev_document_misc_paint_one_page (GTK_WIDGET(view)->window,
                                         GTK_WIDGET (view),
-                                        page_area, border);
+                                        page_area, border, 
+                                        page == current_page);
 
        if (gdk_rectangle_intersect (&real_page_area, expose_area, &overlap)) {
                GdkPixbuf *selection_pixbuf = NULL;
@@ -2432,7 +2415,7 @@ ev_view_class_init (EvViewClass *class)
        gtk_object_class->destroy = ev_view_destroy;
 
        class->set_scroll_adjustments = ev_view_set_scroll_adjustments;
-       class->binding_activated = ev_view_binding_activated;
+       class->binding_activated = ev_view_scroll;
 
        widget_class->set_scroll_adjustments_signal =
            g_signal_new ("set-scroll-adjustments",
@@ -2562,14 +2545,14 @@ ev_view_class_init (EvViewClass *class)
 
        binding_set = gtk_binding_set_by_class (class);
 
-       add_scroll_binding_keypad (binding_set, GDK_Left,  0, GTK_SCROLL_STEP_BACKWARD, TRUE);
-       add_scroll_binding_keypad (binding_set, GDK_Right, 0, GTK_SCROLL_STEP_FORWARD,  TRUE);
-       add_scroll_binding_keypad (binding_set, GDK_Left,  GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, TRUE);
-       add_scroll_binding_keypad (binding_set, GDK_Right, GDK_MOD1_MASK, GTK_SCROLL_STEP_UP,  TRUE);
-       add_scroll_binding_keypad (binding_set, GDK_Up,    0, GTK_SCROLL_STEP_BACKWARD, FALSE);
-       add_scroll_binding_keypad (binding_set, GDK_Down,  0, GTK_SCROLL_STEP_FORWARD,  FALSE);
-       add_scroll_binding_keypad (binding_set, GDK_Up,    GDK_MOD1_MASK, GTK_SCROLL_STEP_DOWN, FALSE);
-       add_scroll_binding_keypad (binding_set, GDK_Down,  GDK_MOD1_MASK, GTK_SCROLL_STEP_UP,  FALSE);
+       add_scroll_binding_keypad (binding_set, GDK_Left,  0, EV_SCROLL_STEP_BACKWARD, TRUE);
+       add_scroll_binding_keypad (binding_set, GDK_Right, 0, EV_SCROLL_STEP_FORWARD,  TRUE);
+       add_scroll_binding_keypad (binding_set, GDK_Left,  GDK_MOD1_MASK, EV_SCROLL_STEP_DOWN, TRUE);
+       add_scroll_binding_keypad (binding_set, GDK_Right, GDK_MOD1_MASK, EV_SCROLL_STEP_UP,  TRUE);
+       add_scroll_binding_keypad (binding_set, GDK_Up,    0, EV_SCROLL_STEP_BACKWARD, FALSE);
+       add_scroll_binding_keypad (binding_set, GDK_Down,  0, EV_SCROLL_STEP_FORWARD,  FALSE);
+       add_scroll_binding_keypad (binding_set, GDK_Up,    GDK_MOD1_MASK, EV_SCROLL_STEP_DOWN, FALSE);
+       add_scroll_binding_keypad (binding_set, GDK_Down,  GDK_MOD1_MASK, EV_SCROLL_STEP_UP,  FALSE);
 }
 
 static void
@@ -2593,6 +2576,7 @@ ev_view_init (EvView *view)
        view->fullscreen = FALSE;
        view->sizing_mode = EV_SIZING_FIT_WIDTH;
        view->pending_scroll = SCROLL_TO_KEEP_POSITION;
+       view->jump_to_find_result = TRUE;
 }
 
 /*** Callbacks ***/
@@ -2606,8 +2590,11 @@ find_changed_cb (EvDocument *document, int page, EvView *view)
        percent = ev_document_find_get_progress
                        (EV_DOCUMENT_FIND (view->document)); 
        n_pages = ev_page_cache_get_n_pages (view->page_cache);
-       jump_to_find_page (view, EV_VIEW_FIND_NEXT, 0);
-       jump_to_find_result (view);
+       
+       if (view->jump_to_find_result == TRUE) {
+               jump_to_find_page (view, EV_VIEW_FIND_NEXT, 0);
+               jump_to_find_result (view);
+       }
        update_find_status_message (view, percent * n_pages >= n_pages - 1 );
        if (view->current_page == page)
                gtk_widget_queue_draw (GTK_WIDGET (view));
@@ -2626,15 +2613,16 @@ page_changed_cb (EvPageCache *page_cache,
                 EvView      *view)
 {
        if (view->current_page != new_page) {
-
                view->current_page = new_page;
                view->pending_scroll = SCROLL_TO_PAGE_POSITION;
                gtk_widget_queue_resize (GTK_WIDGET (view));
+       } else {
+               gtk_widget_queue_draw (GTK_WIDGET (view));
+       }
 
-               if (EV_IS_DOCUMENT_FIND (view->document)) {
-                       view->find_result = 0;
-                       update_find_status_message (view, TRUE);
-               }
+       if (EV_IS_DOCUMENT_FIND (view->document)) {
+               view->find_result = 0;
+               update_find_status_message (view, TRUE);
        }
 }
 
@@ -3461,6 +3449,12 @@ ev_view_find_previous (EvView *view)
        }
 }
 
+void ev_view_search_changed (EvView *view)
+{
+       /* search string has changed, focus on new search result */
+       view->jump_to_find_result = TRUE;
+}
+
 /*** Selections ***/
 
 /* compute_new_selection_rect/text calculates the area currently selected by
@@ -3970,7 +3964,11 @@ ev_view_next_page (EvView *view)
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
 
        page = ev_page_cache_get_current_page (view->page_cache);
-       page = ev_view_get_dual_page (view) ? page + 2 : page + 1;
+
+       if (view->dual_page && !view->presentation)
+               page = page + 2; 
+       else 
+               page = page + 1;
 
        if (page < ev_page_cache_get_n_pages (view->page_cache)) {
                ev_page_cache_set_current_page (view->page_cache, page);
@@ -3991,7 +3989,11 @@ ev_view_previous_page (EvView *view)
        g_return_val_if_fail (EV_IS_VIEW (view), FALSE);
 
        page = ev_page_cache_get_current_page (view->page_cache);
-       page = ev_view_get_dual_page (view) ? page - 2 : page - 1;
+
+       if (view->dual_page && !view->presentation)
+               page = page - 2; 
+       else 
+               page = page - 1;
 
        if (page >= 0) {
                ev_page_cache_set_current_page (view->page_cache, page);
@@ -4021,3 +4023,22 @@ ev_sizing_mode_get_type (void)
   }
   return etype;
 }
+
+GType
+ev_scroll_type_get_type (void)
+{
+  static GType etype = 0;
+  if (etype == 0) {
+    static const GEnumValue values[] = {
+      { EV_SCROLL_PAGE_FORWARD, "EV_SCROLL_PAGE_FORWARD", "scroll-page-forward" },
+      { EV_SCROLL_PAGE_BACKWARD, "EV_SCROLL_PAGE_BACKWARD", "scroll-page-backward" },
+      { EV_SCROLL_STEP_FORWARD, "EV_SCROLL_STEP_FORWARD", "scroll-step-forward" },
+      { EV_SCROLL_STEP_FORWARD, "EV_SCROLL_STEP_FORWARD", "scroll-step-forward" },
+      { EV_SCROLL_STEP_UP, "EV_SCROLL_STEP_UP", "scroll-step-up" },
+      { EV_SCROLL_STEP_DOWN, "EV_SCROLL_STEP_DOWN", "scroll-step-down" },
+      { 0, NULL, NULL }
+    };
+    etype = g_enum_register_static ("EvScrollType", values);
+  }
+  return etype;
+}