From 5fe9876bfc70f8ca88f4ba282c3d782cd4c36794 Mon Sep 17 00:00:00 2001 From: ZenWalker Date: Sun, 7 May 2017 05:01:45 +0200 Subject: Fix: Browsing history not correct Fixes #167 based in file-roller commit: https://git.gnome.org/browse/file-roller/commit/?id=bd8807beb9a026be2441aa492815b65a6fc94429 --- src/fr-window.c | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/src/fr-window.c b/src/fr-window.c index 9ac4053..cde9bb8 100644 --- a/src/fr-window.c +++ b/src/fr-window.c @@ -865,23 +865,38 @@ static void fr_window_history_add (FrWindow *window, const char *path) { - if ((window->priv->history != NULL) && (window->priv->history_current != NULL)) { - if (strcmp (window->priv->history_current->data, path) == 0) - return; + if ((window->priv->history_current == NULL) || (g_strcmp0 (path, window->priv->history_current->data) != 0)) { + GList *scan; + GList *new_current = NULL; - /* Add locations visited using the back button to the history - * list. */ - if (window->priv->history != window->priv->history_current) { - GList *scan = window->priv->history->next; - while (scan != window->priv->history_current->next) { - window->priv->history = g_list_prepend (window->priv->history, g_strdup (scan->data)); - scan = scan->next; + /* search the path in the history */ + for (scan = window->priv->history_current; scan; scan = scan->next) { + char *path_in_history = scan->data; + + if (g_strcmp0 (path, path_in_history) == 0) { + new_current = scan; + break; } } - } - window->priv->history = g_list_prepend (window->priv->history, g_strdup (path)); - window->priv->history_current = window->priv->history; + if (new_current != NULL) { + window->priv->history_current = new_current; + } + else { + /* remove all the paths after the current position */ + for (scan = window->priv->history; scan && (scan != window->priv->history_current); /* void */) { + GList *next = scan->next; + + window->priv->history = g_list_remove_link (window->priv->history, scan); + path_list_free (scan); + + scan = next; + } + + window->priv->history = g_list_prepend (window->priv->history, g_strdup (path)); + window->priv->history_current = window->priv->history; + } + } } -- cgit v1.2.1