Download raw body.
tog: tree view page up/down bugs
On Wed, Nov 25, 2020 at 02:04:02PM +0100, Christian Weisgerber wrote: > Stefan Sperling: > > > On Wed, Nov 25, 2020 at 12:08:29AM +0100, Stefan Sperling wrote: > > > This should fix page-up/page-down behaviour in 'tog tree'. > > > > My previous patch displayed a bogus .. parent directory entry after > > page-up was pressed in the root directory. Fixed here. > > Something isn't right: > * In the got repository, start "tog tree lib". > * Move down until the first displayed entry is "blame.c". > * Move up again until "blame.c" is selected. > * Move up one more. The selection now jumps to "..", skipping > "arraylist.h". Thanks. Should be fixed with this version of the patch. diff refs/heads/main refs/heads/togtree blob - feaac17d0e83e59b9ef24e80a5f347f16db2f891 blob + 1f237865b895aeaddf0db2aa913b97b6b8a8ec75 --- tog/tog.c +++ tog/tog.c @@ -4998,29 +4998,32 @@ tree_scroll_up(struct tog_view *view, struct got_tree_object *tree, int isroot) { struct got_tree_entry *te; - int i; + int i = 0; if (*first_displayed_entry == NULL) return; - te = got_object_tree_get_entry(tree, 0); + te = got_object_tree_get_first_entry(tree); if (*first_displayed_entry == te) { if (!isroot) *first_displayed_entry = NULL; return; } - i = 0; - while (*first_displayed_entry && i < maxscroll) { - *first_displayed_entry = got_tree_entry_get_prev(tree, - *first_displayed_entry); - i++; + if (*first_displayed_entry) { + te = got_tree_entry_get_prev(tree, *first_displayed_entry); + if (te == NULL && !isroot) { + *first_displayed_entry = NULL; + return; + } + while (te && i++ < maxscroll) { + *first_displayed_entry = te; + te = got_tree_entry_get_prev(tree, te); + } } - if (!isroot && te == got_object_tree_get_first_entry(tree) && i < maxscroll) - *first_displayed_entry = NULL; } -static int +static void tree_scroll_down(struct got_tree_entry **first_displayed_entry, int maxscroll, struct got_tree_entry *last_displayed_entry, struct got_tree_object *tree) @@ -5041,7 +5044,6 @@ tree_scroll_down(struct got_tree_entry **first_display next = got_tree_entry_get_next(tree, next); } } - return n; } static const struct got_error * @@ -5366,7 +5368,7 @@ input_tree_view(struct tog_view **new_view, struct tog const struct got_error *err = NULL; struct tog_tree_view_state *s = &view->state.tree; struct tog_view *log_view; - int begin_x = 0, nscrolled; + int begin_x = 0; switch (ch) { case 'i': @@ -5397,23 +5399,23 @@ input_tree_view(struct tog_view **new_view, struct tog case KEY_UP: if (s->selected > 0) { s->selected--; - if (s->selected == 0) - break; - } - if (s->selected > 0) break; + } tree_scroll_up(view, &s->first_displayed_entry, 1, s->tree, s->tree == s->root); break; case KEY_PPAGE: case CTRL('b'): + if (s->tree == s->root) { + if (got_object_tree_get_first_entry(s->tree) == + s->first_displayed_entry) + s->selected = 0; + } else { + if (s->first_displayed_entry == NULL) + s->selected = 0; + } tree_scroll_up(view, &s->first_displayed_entry, - MAX(0, view->nlines - 4 - s->selected), s->tree, - s->tree == s->root); - s->selected = 0; - if (got_object_tree_get_first_entry(s->tree) == - s->first_displayed_entry && s->tree != s->root) - s->first_displayed_entry = NULL; + MAX(0, view->nlines - 3), s->tree, s->tree == s->root); break; case 'j': case KEY_DOWN: @@ -5437,18 +5439,8 @@ input_tree_view(struct tog_view **new_view, struct tog s->selected = s->ndisplayed - 1; break; } - nscrolled = tree_scroll_down(&s->first_displayed_entry, - view->nlines, s->last_displayed_entry, s->tree); - if (nscrolled < view->nlines) { - int ndisplayed = 0; - struct got_tree_entry *te; - te = s->first_displayed_entry; - do { - ndisplayed++; - te = got_tree_entry_get_next(s->tree, te); - } while (te); - s->selected = ndisplayed - 1; - } + tree_scroll_down(&s->first_displayed_entry, view->nlines - 3, + s->last_displayed_entry, s->tree); break; case KEY_ENTER: case '\r':
tog: tree view page up/down bugs