Download raw body.
tog: tree view page up/down bugs
On Tue, Nov 24, 2020 at 11:13:34PM +0100, Christian Weisgerber wrote: > In tog's tree view, the page up/down handling is different from the > log and blame views as well as buggy. > > There are two aspects to this: > (1) how many lines to move up or down > (2) which entry to select afterwards > > Each of those views has a fixed header and a certain number of > visible lines below. > > (1) > log and blame always move the full number of visible lines up and > down (assuming there are sufficient entries). > > For page down, tree moves too many lines. It uses the full window > height. It needs to subtract the height of the fixed header. > > For page up, tree moves one line too little. > > (2) > If the nth visible entry is selected, log and blame will also select > the nth visible entry after scrolling up/down (assuming there are > sufficient entries). > > For page down, tree behaves like log and blame. > > For page up, tree always moves the selection to the first visible > entry. > > > There may be an additional logic bug in the tree view when going a > page up from the bottom; or maybe it's just the combination of the > two above, I'm not sure. > > The ref view scroll logic was copied from the tree view, so it > shares these problems, along with the problem I already reported > that feels like an off-by-one somewhere. Thanks for the detailed report! This should fix page-up/page-down behaviour in 'tog tree'. I will look into fixing the ref view next. diff c42c9805fb36a73a8de6f81318a07617264ca7e0 /home/stsp/src/got blob - 271c8a99135a8ba952cac81f6a4ab6c07a67e10c file + tog/tog.c --- tog/tog.c +++ tog/tog.c @@ -5020,7 +5020,7 @@ tree_scroll_up(struct tog_view *view, *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 +5041,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 +5365,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': @@ -5407,13 +5406,17 @@ input_tree_view(struct tog_view **new_view, struct tog break; case KEY_PPAGE: case CTRL('b'): - 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; + s->first_displayed_entry || + s->first_displayed_entry == NULL) { + if (s->tree == s->root || + s->first_displayed_entry == NULL) + s->selected = 0; + else if (s->tree != s->root) + s->first_displayed_entry = NULL; + } + tree_scroll_up(view, &s->first_displayed_entry, + MAX(0, view->nlines - 3), s->tree, s->tree == s->root); break; case 'j': case KEY_DOWN: @@ -5437,18 +5440,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