[evince] history: Record current page when going back in history



commit e50b114b970e70bb4663a6467383f9827d2d7c69
Author: Casey Jao <casey jao gmail com>
Date:   Wed Aug 22 05:48:45 2018 -0700

    history: Record current page when going back in history
    
    Adjust ev_history_can_go_back to trigger when the
    current page differs by >1 from the head of the history.
    
    Partially fixes #810 (4/5)

 shell/ev-history.c | 12 +++++++++---
 shell/ev-window.c  | 53 +++++++++++++++++++++++++++++++++++------------------
 2 files changed, 44 insertions(+), 21 deletions(-)
---
diff --git a/shell/ev-history.c b/shell/ev-history.c
index 7e254fb2..a0b33d18 100644
--- a/shell/ev-history.c
+++ b/shell/ev-history.c
@@ -22,6 +22,7 @@
 
 #include <glib/gi18n.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include "ev-history.h"
 
@@ -49,8 +50,9 @@ G_DEFINE_TYPE_WITH_PRIVATE (EvHistory, ev_history, G_TYPE_OBJECT)
 
 #define GET_PRIVATE(o) ev_history_get_instance_private (o);
 
-static void ev_history_set_model (EvHistory       *history,
-                                  EvDocumentModel *model);
+static void ev_history_set_model        (EvHistory       *history,
+                                         EvDocumentModel *model);
+static gint ev_history_get_current_page (EvHistory       *history);
 
 static void
 clear_list (GList *list)
@@ -196,10 +198,14 @@ ev_history_can_go_back (EvHistory *history)
 
         g_return_val_if_fail (EV_IS_HISTORY (history), FALSE);
 
+        priv = GET_PRIVATE (history);
+
         if (ev_history_is_frozen (history))
                 return FALSE;
 
-        priv = GET_PRIVATE (history);
+        if (abs (ev_document_model_get_page (priv->model) - ev_history_get_current_page (history)) > 1)
+              return TRUE;
+
         return priv->current && priv->current->prev;
 }
 
diff --git a/shell/ev-window.c b/shell/ev-window.c
index bf482441..67f67190 100644
--- a/shell/ev-window.c
+++ b/shell/ev-window.c
@@ -974,8 +974,10 @@ bookmark_activated_cb (EvSidebarBookmarks *sidebar_bookmarks,
                       gint                page,
                       EvWindow           *window)
 {
-       ev_history_add_page (window->priv->history, old_page);
-       ev_history_add_page (window->priv->history, page);
+       EvWindowPrivate *priv = ev_window_get_instance_private (window);
+
+       ev_history_add_page (priv->history, old_page);
+       ev_history_add_page (priv->history, page);
 }
 
 static void
@@ -984,26 +986,29 @@ scroll_history_cb (EvView        *view,
                   gboolean       horizontal,
                   EvWindow      *window)
 {
-       if (!window->priv->document)
-               return;
-
+       EvWindowPrivate *priv = ev_window_get_instance_private (window);
        gint old_page = -1;
        gint new_page = -1;
+
+       if (!priv->document)
+               return;
+
        switch (scroll) {
                case GTK_SCROLL_START:
-                       old_page = ev_document_model_get_page (window->priv->model);
+                       old_page = ev_document_model_get_page (priv->model);
                        new_page = 0;
                        break;
                case GTK_SCROLL_END:
-                       old_page = ev_document_model_get_page (window->priv->model);
-                       new_page = ev_document_get_n_pages (window->priv->document) - 1;
+                       old_page = ev_document_model_get_page (priv->model);
+                       new_page = ev_document_get_n_pages (priv->document) - 1;
                        break;
                default:
                        break;
        }
+
        if (old_page >= 0 && new_page >= 0) {
-               ev_history_add_page (window->priv->history, old_page);
-               ev_history_add_page (window->priv->history, new_page);
+               ev_history_add_page (priv->history, old_page);
+               ev_history_add_page (priv->history, new_page);
        }
 }
 
@@ -1013,27 +1018,29 @@ scroll_child_history_cb (GtkScrolledWindow *scrolled_window,
                         gboolean           horizontal,
                         EvWindow          *window)
 {
-       if (!window->priv->document)
+       EvWindowPrivate *priv = ev_window_get_instance_private (window);
+
+       if (!priv->document)
                return;
 
-       if (ev_document_model_get_continuous (window->priv->model) && !horizontal) {
+       if (ev_document_model_get_continuous (priv->model) && !horizontal) {
                gint old_page = -1;
                gint new_page = -1;
                switch (scroll) {
                case GTK_SCROLL_START:
-                       old_page = ev_document_model_get_page (window->priv->model);
+                       old_page = ev_document_model_get_page (priv->model);
                        new_page = 0;
                        break;
                case GTK_SCROLL_END:
-                       old_page = ev_document_model_get_page (window->priv->model);
-                       new_page = ev_document_get_n_pages (window->priv->document) - 1;
+                       old_page = ev_document_model_get_page (priv->model);
+                       new_page = ev_document_get_n_pages (priv->document) - 1;
                        break;
                default:
                        break;
                }
                if (old_page >= 0 && new_page >= 0) {
-                       ev_history_add_page (window->priv->history, old_page);
-                       ev_history_add_page (window->priv->history, new_page);
+                       ev_history_add_page (priv->history, old_page);
+                       ev_history_add_page (priv->history, new_page);
 
                }
        }
@@ -5071,6 +5078,10 @@ ev_window_cmd_go_back_history (GSimpleAction *action,
 {
        EvWindow *ev_window = user_data;
        EvWindowPrivate *priv = GET_PRIVATE (ev_window);
+       gint old_page = ev_document_model_get_page (priv->model);
+
+       if (old_page >= 0)
+               ev_history_add_page (priv->history, old_page);
 
        ev_history_go_back (priv->history);
 }
@@ -6365,9 +6376,15 @@ ev_window_button_press_event (GtkWidget      *widget,
        EvWindowPrivate *priv = GET_PRIVATE (window);
 
         switch (event->button) {
-        case MOUSE_BACK_BUTTON:
+        case MOUSE_BACK_BUTTON: {
+               gint old_page = ev_document_model_get_page (priv->model);
+
+               if (old_page >= 0)
+                       ev_history_add_page (priv->history, old_page);
+
                 ev_history_go_back (priv->history);
                 return TRUE;
+       }
         case MOUSE_FORWARD_BUTTON:
                 ev_history_go_forward (priv->history);
                 return TRUE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]